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

时间:2012-10-26 19:00:12

标签: python numpy

我对Python很陌生,对Numpy来说很新。

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

例如,我的数据类似于

[[1 1 1 1]
 [2 3 4 5]
 [6 7 8 9]
 [2 2 2 2]]

我的索引数组是

[0 2]

我希望两个得到两个数组,一个

[[1 1 1 1]
 [6 7 8 9]]

[[2 3 4 5]
 [2 2 2 2]]

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

[[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]]

我的索引数组是

[0 2 3 5]

我希望两个得到两个数组,一个

[[1 1 1 1]
 [6 7 8 9]
 [2 2 2 2]
 [4 4 4 4]]

[[2 3 4 5]
 [3 3 3 3]
 [5 5 5 5]
 [6 6 6 6]
 [7 7 7 7]]

我已经研究过numpy.take()和numpy.choose(),但我无法理解。谢谢!

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

1 个答案:

答案 0 :(得分: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]])

因此,只要b无法从a中选择,您就可以创建一个True的布尔值。


实际上已经有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]])]

split总是包含来自0:b[0]b[0]:的切片,我想你可以将它们从结果中切出来以简化。如果您当然有定期拆分(大小相同),那么使用reshape可能会更好。

另请注意,这会返回 views 。因此,如果您更改这些数组,则更改原始数据,除非您先调用.copy