如何从排列的numpy数组中提取数组?
这是后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
功能可以处理这种整数阵列任务,但如何处理含浮标阵?
下面是一个方法考虑对从各行的元素作为索引的元组 -
# 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
。
的numpy_indexed包(免责声明:我是它的作者)包含的功能,以有效地执行这些类型的操作:
import numpy_indexed as npi
npi.group_by(a[:, :2]).split(a)
它体面的测试覆盖率,所以ID感到惊讶,如果它绊倒你的看似简单的测试案件。
谢谢你的答案,我会下载并测试这个numpy_indexed包,但我更喜欢用python和numpy来解决这个问题。无论如何,谢谢。 – Heinz
如果我直接适用该分割线到你的阵列我得到你的结果,空数组加上原有
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]])]
感谢您的回答,但如何处理未排序的输入数组? – Heinz
谢谢你的建议和详细的链接,ravel_multi_index函数可以用整数处理数组,但我想知道如何做与浮点数组相同的工作,因为函数似乎只能用整数工作。 – Heinz
@ Heinz在计算'lidx'的第一步中,使用'np.unique(a [:,:2],return_inverse = 1)[1] .reshape(-1,2)'代替'arr [ ,:2]'。 – Divakar
Thx,工作! – Heinz