9

我对 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() 但我无法弄清楚。谢谢!

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

4

1 回答 1

15

抱歉,所以您已经拥有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]])

因此,您只需创建一个布尔掩码,该掩码为 True whereb不会选择 from 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]])]

split 始终包含来自0:b[0]and的切片b[0]:,我想您可以为简单起见将它们从结果中切出。当然,如果您有常规拆分(所有相同的大小),您可能会更好地使用reshape.

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

于 2012-10-26T19:24:46.633 回答