如何基于索引数组拆分ndarray?

k.s*_*r31 7 python numpy

我是Python的新手,也是Numpy的新手.

到目前为止,我有一个数据的ndarray,其中是列表列表,我有一个索引数组.如何删除索引数组中的每一行索引并将该行放入新的ndarray?

例如,我的数据看起来像

[[1 1 1 1]
 [2 3 4 5]
 [6 7 8 9]
 [2 2 2 2]]
Run Code Online (Sandbox Code Playgroud)

我的索引数组是

[0 2]
Run Code Online (Sandbox Code Playgroud)

我想要两个得到两个数组,其中一个

[[1 1 1 1]
 [6 7 8 9]]
Run Code Online (Sandbox Code Playgroud)

[[2 3 4 5]
 [2 2 2 2]]
Run Code Online (Sandbox Code Playgroud)

为清晰起见,扩展示例:例如,我的数据看起来像

[[1 1 1 1]
 [2 3 4 5]
 [6 7 8 9]
 [2 2 2 2]
 [3 3 3 3]
 [4 4 4 4]
 [5 5 5 5]
 [6 6 6 6]
 [7 7 7 7]]
Run Code Online (Sandbox Code Playgroud)

我的索引数组是

[0 2 3 5]
Run Code Online (Sandbox Code Playgroud)

我想要两个得到两个数组,其中一个

[[1 1 1 1]
 [6 7 8 9]
 [2 2 2 2]
 [4 4 4 4]]
Run Code Online (Sandbox Code Playgroud)

[[2 3 4 5]
 [3 3 3 3]
 [5 5 5 5]
 [6 6 6 6]
 [7 7 7 7]]
Run Code Online (Sandbox Code Playgroud)

我已经研究过numpy.take()和numpy.choose(),但我无法弄明白.谢谢!

编辑:我还应该补充一点,我的输入数据和索引数组的长度可变,具体取决于数据集.我想要一个适用于可变尺寸的解决方案.

seb*_*erg 12

对不起,所以你已经拥有take并且基本上需要相反的take,你可以很好地得到一些索引:

a = np.arange(16).reshape((8,2))
b = [2, 6, 7]
mask = np.ones(len(a), dtype=bool)
mask[b,] = False
x, y = a[b], a[mask] # instead of a[b] you could also do a[~mask]
print x
array([[ 4,  5],
       [12, 13],
       [14, 15]])
print y
array([[ 0,  1],
       [ 2,  3],
       [ 6,  7],
       [ 8,  9],
       [10, 11]])
Run Code Online (Sandbox Code Playgroud)

因此,您只需创建一个布尔掩码,即b无法从中进行选择a.


实际上已经np.split有处理这个(它的纯python代码,但这不应该真的打扰你):

>>> a = np.arange(16).reshape((8,2))
>>> b = [2, 6]
>>> print np.split(a, b, axis=0) # plus some extra formatting
[array([[0, 1],
       [2, 3]]),
 array([[ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11]]),
 array([[12, 13],
       [14, 15]])]
Run Code Online (Sandbox Code Playgroud)

split总是包含来自0:b[0]和的切片b[0]:,我想你可以将它们从结果中切出来以简化.如果你当然有规律的分割(所有相同的大小),你可能会更好地使用reshape.

另请注意,这会返回视图.因此,如果您更改这些阵列,则除非.copy先调用,否则请更改原始阵列.