2016-09-29 71 views
1

这是后How to extract rows from an numpy array based on the content?的相对的问题,我用下面的代码基于列的内容来分割行:如何从排列的numpy数组中提取数组?

np.split(sorted_a,np.unique(sorted_a[:,1],return_index=True)[1][1:]) 

代码工作得很好,但后来我试过其他代码分裂个案(如下),我发现可能有错误的结果(如案例#1所示)。

CASE#1 
[[2748309, 246211, 1], 
[2748309, 246211, 2], 
[2747481, 246201, 54]] 
OUTPUT#1 
[] 
[[2748309, 246211, 1], 
[2748309, 246211, 2], 
[2747481, 246201, 54]] 
the result I want 
[[2748309, 246211, 1], 
[2748309, 246211, 2]] 
[[2747481, 246201, 54]] 

我觉得代码可以成功地只能与小数字,用更少的位数的情况下拆分行,我不知道如何解决问题,在上述情况下#1显示。所以在这篇文章中,我有两个小的相关问题:

1.如何拆分其中包含更多数字的行? (如情况1所示)?

2.如何在两种情况下处理(拆分)数据,包括第二列中具有相同元素的#1行,但第一列中具有相同元素的第一行和#2行不同,但在第二个不同? (也就是说,Python可以同时考虑第一列和第二列中的内容来区分行)

随时给我建议,谢谢。

更新#1

ravel_multi_index功能可以处理这种整数阵列任务,但如何处理含浮标阵?

回答

1

下面是一个方法考虑对从各行的元素作为索引的元组 -

# Convert to linear index equivalents 
lidx = np.ravel_multi_index(arr[:,:2].T,arr[:,:2].max(0)+1) 

# Get sorted indices of lidx. Using those get shifting indices. 
# Split along sorted input array along axis=0 using those. 
sidx = lidx.argsort() 
out = np.split(arr[sidx],np.unique(lidx[sidx],return_index=1)[1][1:]) 

采样运行 -

In [34]: arr 
Out[34]: 
array([[2, 7, 5], 
     [3, 4, 6], 
     [2, 3, 5], 
     [2, 7, 7], 
     [4, 4, 7], 
     [3, 4, 6], 
     [2, 8, 5]]) 

In [35]: out 
Out[35]: 
[array([[2, 3, 5]]), array([[2, 7, 5], 
     [2, 7, 7]]), array([[2, 8, 5]]), array([[3, 4, 6], 
     [3, 4, 6]]), array([[4, 4, 7]])] 

有关转换元件组作为索引元组的详细信息,请参阅this post

+0

谢谢你的建议和详细的链接,ravel_multi_index函数可以用整数处理数组,但我想知道如何做与浮点数组相同的工作,因为函数似乎只能用整数工作。 – Heinz

+1

@ Heinz在计算'lidx'的第一步中,使用'np.unique(a [:,:2],return_inverse = 1)[1] .reshape(-1,2)'代替'arr [ ,:2]'。 – Divakar

+0

Thx,工作! – Heinz

0

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

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

它体面的测试覆盖率,所以ID感到惊讶,如果它绊倒你的看似简单的测试案件。

+0

谢谢你的答案,我会下载并测试这个numpy_indexed包,但我更喜欢用python和numpy来解决这个问题。无论如何,谢谢。 – Heinz

0

如果我直接适用该分割线到你的阵列我得到你的结果,空数组加上原有

In [136]: np.split(a,np.unique(a[:,1],return_index=True)[1][1:]) 
Out[136]: 
[array([], shape=(0, 3), dtype=int32), 
array([[2748309, 246211,  1], 
     [2748309, 246211,  2], 
     [2747481, 246201,  54]])] 

但是,如果我第一次在第2列的排列,如联答案指定排序时,得到所需的答案 - 与2个阵列切换

In [141]: sorted_a=a[np.argsort(a[:,1])] 
In [142]: sorted_a 
Out[142]: 
array([[2747481, 246201,  54], 
     [2748309, 246211,  1], 
     [2748309, 246211,  2]]) 
In [143]: np.split(sorted_a,np.unique(sorted_a[:,1],return_index=True)[1][1:]) 
Out[143]: 
[array([[2747481, 246201,  54]]), 
array([[2748309, 246211,  1], 
     [2748309, 246211,  2]])] 
+0

感谢您的回答,但如何处理未排序的输入数组? – Heinz