作为标题,例如,我有一个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函数来完成这类工作,因为我可以拥有比上面更大的数组。随意给我建议,谢谢。
答案 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)