说我有阵列:
>>> import numpy as np
>>> myarr = np.array([[1],[2],[3],[2]])
我希望使用逻辑索引来返回myarr
不等于2的子数组。
>>> subarr = myarr[myarr != 2]
>>> print subarr
[1 3]
因此,myarr.shape = (4,1)
但subarr.shape = (2,)
。
当逻辑索引不影响维度2时,为什么更改维度2的大小?我可以很容易地重塑输出,但如果我需要经常在我的代码中使用逻辑索引,我不想总是考虑额外的维度(即显然与我正在做的逻辑切片无关的维度)可能已经改变了。
这(N,1) - > (K,)示例特别麻烦,因为逐个数组的任何逻辑片段也必须是逐个数组。
我觉得必须有一种更简洁的方法让NumPy切片操作单独留下琐碎的数组维度。有什么建议吗?
答案 0 :(得分:2)
使用布尔数组进行numpy索引与使用array.nonzero()进行索引相同。因为array.nonzero()为2darray返回两组索引,所以实际上是在第一维和第二维上进行索引:
>>> myarr = np.array([[1],[2],[3],[2]])
>>> (myarr != 2).nonzero()
(array([0, 2]), array([0, 0]))
>>> myarr[(array([0, 2]), array([0, 0]))]
array([1, 3])
你真正想要的是:
>>> myarr[array([0, 2])]
array([[1],
[3]])
您可以通过以下方式获取:
>>> myarr[myarr[:,0] != 2]
array([[1],
[3]])
或:
>>> myarr[(myarr != 2).nonzero()[0]]
array([[1],
[3]])