NumPy数组中的元素索引

时间:2013-08-06 11:32:25

标签: python arrays numpy indexing indexof

在Python中,我们可以使用.index()获取数组中值的索引。我怎么能用NumPy数组呢?

当我尝试

decoding.index(i)

它说NumPy库不支持这个功能。有办法吗?

6 个答案:

答案 0 :(得分:70)

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

示例:

对于名为np.ndarray的2D a

i, j = np.where(a == value)

对于一维阵列:

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

适用于>=<=!=等条件......

您还可以使用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]),)

答案 1 :(得分:12)

您可以将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

我就是你想要的。

答案 2 :(得分:7)

我在实现NumPy数组索引的这两种方式之间徘徊:

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

两者都使用相同数量的字符,但第一种方法返回int而不是numpy.ndarray

答案 3 :(得分:3)

使用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),并且已完全矢量化。

答案 4 :(得分:1)

您可以使用函数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]))

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

答案 5 :(得分:0)

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

a = np.random.randint(0, 100, 10)
sorted_idx = np.argsort(a)