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数组中元素的索引[重复]的主要内容,如果未能解决你的问题,请参考以下文章