NumPy数组中的元素索引

Mar*_*tiz 54 python arrays indexing numpy indexof

在Python中,我们可以使用.index()获取数组中值的索引.我怎么能用NumPy数组做到这一点?

当我尝试做的时候

decoding.index(i)
Run Code Online (Sandbox Code Playgroud)

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

Sau*_*tro 89

使用np.where来获得,其中一个给定的条件是指数True.

例子:

对于2D np.ndarray调用a:

i, j = np.where(a == value)
Run Code Online (Sandbox Code Playgroud)

对于1D阵列:

i, = np.where(a == value)
Run Code Online (Sandbox Code Playgroud)

这对于像条件的作品>=,<=,!=等等...

您还可以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)
Run Code Online (Sandbox Code Playgroud)

测试:

a = myarray([1,2,3,4,4,4,5,6,4,4,4])
a.index(4)
#(array([ 3,  4,  5,  8,  9, 10]),)
Run Code Online (Sandbox Code Playgroud)

  • 为什么在一维情况下变量名后面有逗号?以防万一输入不好? (2认同)
  • @BUFU,那是因为 `np.where` 的输出始终是一个 `tuple`。如果我使用“i = np.where(...)”,我的变量“i”将是一个“tuple”对象 (2认同)

Sta*_*ham 16

您可以将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
Run Code Online (Sandbox Code Playgroud)

我就是你想要的.


jla*_*sey 8

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

idx = list(classes).index(var)
idx = np.where(classes == var)
Run Code Online (Sandbox Code Playgroud)

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

  • idx = list(classes).index(var) &lt;----- 这太棒了! (2认同)

Eel*_*orn 7

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

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))
Run Code Online (Sandbox Code Playgroud)

该解决方案比之前发布的任何答案具有更好的时间复杂度(最坏情况下为 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()
Run Code Online (Sandbox Code Playgroud)

输出

(array([0, 1]), array([1, 0]))
Run Code Online (Sandbox Code Playgroud)

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