95

在 Python 中,我们可以使用.index().

但是对于 NumPy 数组,当我尝试这样做时:

decoding.index(i)

我得到:

AttributeError:“numpy.ndarray”对象没有属性“index”

我怎么能在 NumPy 数组上做到这一点?

4

6 回答 6

151

用于np.where获取给定条件为 的索引True

例子:

对于np.ndarray称为2D 的 2D a

i, j = np.where(a == value) # when comparing arrays of integers

i, j = np.where(np.isclose(a, value)) # when comparing floating-point arrays

对于一维数组:

i, = np.where(a == value) # integers

i, = np.where(np.isclose(a, value)) # floating-point

请注意,这也适用于>=,<=等条件!=...

您还可以np.ndarray使用index()方法创建子类:

class myarray(np.ndarray):
    def __new__(cls, *args, **kwargs):
        return np.array(*args, **kwargs).view(myarray)
    def index(self, value):
        return np.where(self == value)

测试:

a = myarray([1,2,3,4,4,4,5,6,4,4,4])
a.index(4)
#(array([ 3,  4,  5,  8,  9, 10]),)
于 2013-08-06T11:38:00.067 回答
29

您可以将 numpy 数组转换为 list 并获取其索引。

例如:

tmp = [1,2,3,4,5] #python list
a = numpy.array(tmp) #numpy array
i = list(a).index(2) # i will return index of 2, which is 1

这正是你想要的。

于 2018-04-10T01:46:06.810 回答
16

我在这两种实现 NumPy 数组索引的方法之间纠结:

idx = list(classes).index(var)
idx = np.where(classes == var)

两者都采用相同数量的字符,但第一个方法返回 anint而不是 a numpy.ndarray

于 2016-05-27T14:32:18.060 回答
9

使用numpy_indexed库可以有效地解决这个问题(免责声明:我是它的作者);它是为解决此类问题而创建的。npi.indices 可以看作是 list.index 的 n 维泛化。它将作用于 nd 数组(沿指定轴);并且还将以矢量化方式查找多个条目,而不是一次查找单个项目。

a = np.random.rand(50, 60, 70)
i = np.random.randint(0, len(a), 40)
b = a[i]

import numpy_indexed as npi
assert all(i == npi.indices(a, b))

该解决方案比之前发布的任何答案都具有更好的时间复杂度(最差为 n log n),并且是完全矢量化的。

于 2019-02-05T14:35:09.793 回答
4

您可以使用函数numpy.nonzero()nonzero()数组的方法

import numpy as np

A = np.array([[2,4],
          [6,2]])
index= np.nonzero(A>1)
       OR
(A>1).nonzero()

输出

(array([0, 1]), array([1, 0]))

输出中的第一个数组描述行索引,第二个数组描述相应的列索引

于 2019-01-15T06:25:38.543 回答
2

如果您对索引感兴趣,最好的选择是 np.argsort(a)

a = np.random.randint(0, 100, 10)
sorted_idx = np.argsort(a)
于 2019-02-23T18:43:45.010 回答