简单的方法是让NumPy在逻辑索引之后返回正确形状的数组,而不进行重构?

时间:2012-04-12 20:52:36

标签: python numpy indexing

说我有阵列:

 >>> 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切片操作单独留下琐碎的数组维度。有什么建议吗?

1 个答案:

答案 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]])