如何根据内容从numpy数组中提取行?

时间:2016-09-24 06:42:51

标签: python arrays numpy

作为标题,例如,我有一个2d numpy数组,如下所示,

[[33, 21, 1],
 [33, 21, 2],
 [32, 22, 0],
 [33, 21, 3],
 [34, 34, 1]]

我希望根据第一列和第二列中的内容有序地提取这些行,在这种情况下,我想得到3个不同的2d numpy数组,如下所示,

[[33, 21, 1],
 [33, 21, 2],
 [33, 21, 3]]

[[32, 22, 0]]

[[34, 34, 1]]

我可以使用numpy中的哪个函数来执行此操作?我认为重点是用第一列和第二列区分不同的行。如果这些列中的元素相同,则特定行将分类在同一输出数组中。 我想编写一个python函数来完成这类工作,因为我可以拥有比上面更大的数组。随意给我建议,谢谢。

3 个答案:

答案 0 :(得分:1)

您可以使用布尔索引来执行此操作。要获得您给出的三个示例(按照发布它们的顺序,public function insert_json(){ $data = json_decode($json_result, true); foreach ($data as $row){ $this->Your_model->save_json($row); } } 是原始的2d数组),您可以写:

public function save_json($data){
$this->db->insert('table_name', $data);
}

第一个应该被解释为'提取x的行,其中第二列中的元素等于21'等等。 scipy文档中有一个页面解释了如何在numpy here中使用索引。由于您要求返回的数组都是2D,我使用了numpy.atleast_2d( x[ x[:,1]==21 ] ) numpy.atleast_2d( x[ x[:,2]==0 ] ) numpy.atleast_2d( x[ x[:,2]==1 ] ) 函数。

答案 1 :(得分:1)

这是处理许多此类分组的方法 -

# Sort array based on second column
sorted_a = a[np.argsort(a[:,1])]

# Get shifting indices for first col. Split along axis=0 using those.
shift_idx = np.unique(sorted_a[:,1],return_index=True)[1][1:]
out = np.split(sorted_a,shift_idx)

或者,为了提高效率,我们可以得到shift_idx,就像这样 -

shift_idx = np.flatnonzero(sorted_a[1:,1] > sorted_a[:-1,1])+1

示例运行 -

In [27]: a
Out[27]: 
array([[33, 21,  1],
       [33, 21,  2],
       [32, 22,  0],
       [33, 21,  3],
       [34, 34,  1]])
In [28]: sorted_a = a[np.argsort(a[:,1])]

In [29]: np.split(sorted_a,np.unique(sorted_a[:,1],return_index=True)[1][1:])
Out[29]: 
[array([[33, 21,  1],
        [33, 21,  2],
        [33, 21,  3]]), array([[32, 22,  0]]), array([[34, 34,  1]])]

答案 2 :(得分:1)

numpy_indexed包(免责声明:我是其作者)包含有效执行这些类型操作的功能:

import numpy_indexed as npi
npi.group_by(a[:, :2]).split(a)