我知道没有 python 列表返回的第一个索引的东西的方法

l = list(1,2,3)
l.index(2)
>>>  1

有一些类似的 numpy 阵列吗?

2009-01-11 01:21:39
问题评论:

如果您感觉更好,可以假定,您隐式地说感谢您每次发布问题。拼写出来,不需要实际上没有任何理由将其放回在年中以后。请参阅meta.stackexchange.com/questions/2950/...

注意︰获取一次 NumPy 数组中的几个元素的索引

回答:

是的这里是答案给定 Numpy 数组,数组和值项,搜索。

itemindex = numpy.where(array==item)

结果是第一个元组所有行索引,则所有列索引。

例如,如果数组是两个维度,它包含您的项目在两个位置,然后

array[itemindex[0][0]][itemindex[1][0]]

等同于您的项目,并因此将

array[itemindex[0][1]][itemindex[1][1]]

numpy.where

如果您正在寻找的第一行第一列中存在的项,这工作 (尽管如果不存在,它将引发一个索引错误)rows, columns = np.where(array==item); first_idx = sorted([r for r, c in zip(rows, columns) if c == 0])[0]

此外可以看看这个问题︰ stackoverflow.com/questions/7632963/...

如果您希望其停止搜索后发现的第一个值吗?我并不认为 where() 相当于 find()

啊 !如果您感兴趣的性能,签出此问题的答案︰ stackoverflow.com/questions/7632963/...

如果您需要只有一个值的第一个匹配项的索引,您可以使用nonzero(或where,它都可达到同样的事情在这种情况下)︰

>>> t = array([1, 1, 1, 2, 2, 3, 8, 3, 8, 8])
>>> nonzero(t == 8)
(array([6, 8, 9]),)
>>> nonzero(t == 8)[0][0]
6

如果您需要多个值的第一个索引,显然可以重复,执行与上面相同但没有技巧,它可能会更快。以下查找每个子序列的第一个元素的索引:

>>> nonzero(r_[1, diff(t)[:-1]])
(array([0, 3, 5, 6, 7, 8]),)

请注意它找到的 3 两子序列的开始和 8 的两子序列︰

[1,1,1, 2,2, 3838,8]

因此,找到第一个匹配项的每个值的过程稍有不同。在程序中,您可能能够使用t来获取所需的排序版本︰

>>> st = sorted(t)
>>> nonzero(r_[1, diff(st)[:-1]])
(array([0, 3, 5, 7]),)

能您请解释什么r_是吗?

@Geoff, r_串联;或者,更确切地说,它将翻译沿每条轴连接到切片对象。我可以使用hstack 它可能是不太令人费解。请参阅有关r_详细信息文档另外,还有c_ .

+ 1,好一个 !(vs NP.where) 您的解决方案是大量简单 (和可能更快) 在情况下它只有我们需要一个一维数组中的给定值的第一个匹配项

(查找所有值的第一个索引) 后一种情况由vals, locs = np.unique(t, return_index=True)

如果数组是 broadcastable; 如果您打算将此作为索引到其他内容,则可以使用布尔值的索引您不需要显式索引。只是基于真实值的索引是绝对最简单的方法来执行此操作。

other_array[first_array == item]

任何布尔操作的工作方式︰

a = numpy.arange(100)
other_array[first_array > 50]

非零的方法太采用布尔值︰

index = numpy.nonzero(first_array == item)[0][0]

两个零是元组的索引 (假定 first_array 1d),然后在数组中的第一项的索引。

您也可以转换一个 Numpy 数组列出在空气中,并获取其索引。例如

l = [1,2,3,4,5] #python list
a = numpy.array(l) #numpy array
i = a.tolist().index(2) # i will return index of 2
print i

将打印 1。

要索引的任何条件,可以这样东西如下列︰

In [1]: from numpy import *
In [2]: x = arange(125).reshape((5,5,5))
In [3]: y = indices(x.shape)
In [4]: locs = y[:,x >= 120] # put whatever you want in place of x >= 120
In [5]: pts = hsplit(locs, len(locs[0]))
In [6]: for pt in pts:
   .....:         print(', '.join(str(p[0]) for p in pt))
4, 4, 0
4, 4, 1
4, 4, 2
4, 4, 3
4, 4, 4

[编辑] 和这里除了快速函数做什么 list.index(),如果找不到它,不会引发异常。请注意--这是在大型阵列可能很慢。您有可能 monkeypatch 此阵列到如果您喜欢将其作为一种方法。

def ndindex(ndarray, item):
    if len(ndarray.shape) == 1:
        try:
            return [ndarray.tolist().index(item)]
        except:
            pass
    else:
        for i, subarray in enumerate(ndarray):
            try:
                return [i] + ndindex(subarray, item)
            except:
                pass
In [1]: ndindex(x, 103)
Out[1]: [4, 0, 3]
请输入您的翻译

Is there a Numpy function to return the first index of something in an array?

确认取消