NumPy数组中元素的索引[重复]

Posted

技术标签:

【中文标题】NumPy数组中元素的索引[重复]【英文标题】:Index of element in NumPy array [duplicate] 【发布时间】:2013-08-07 09:24:16 【问题描述】:

在 Python 中,我们可以使用 .index() 获取数组中某个值的索引。

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

decoding.index(i)

我明白了:

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

如何在 NumPy 数组上执行此操作?

【问题讨论】:

【参考方案1】:

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

例子:

对于称为a 的二维np.ndarray

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

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

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

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]),)

【讨论】:

为什么在一维情况下变量名后面有逗号?以防万一输入不好? @BUFU,这是因为np.where 的输出始终是tuple。如果我使用i = np.where(...),我的变量i 将是一个tuple 对象【参考方案2】:

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

例如:

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

这正是你想要的。

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

idx = list(classes).index(var) 【参考方案4】:

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

【讨论】:

【参考方案5】:

你可以使用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]))

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

以上是关于NumPy数组中元素的索引[重复]的主要内容,如果未能解决你的问题,请参考以下文章

numpy - 返回数组中元素的第一个索引[重复]

NumPy 数组切片索引

在 numpy 数组中搜索元素的索引

numpy数组中多个元素的索引

使用重复索引递增 Numpy 数组

如何在python的numpy数组中绑定相同索引的元素