我对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(),但我无法理解。谢谢!
编辑:我还应该补充一点,我的输入数据和索引数组的长度可变,具体取决于数据集。我想要一个适用于可变尺寸的解决方案。
答案 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
。