2

说我有数组:

 >>> 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 切片操作不理会琐碎的数组维度。有什么建议么?

4

1 回答 1

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]])
于 2012-04-12T21:24:50.440 回答