Numpy通过递增元素的索引来获取元素

时间:2014-11-21 07:14:45

标签: numpy

import numpy as np

a = np.array([1,2,13,7,3,5])
index = a == 13
print a[index+1]

预期结果是7.如何获得?

4 个答案:

答案 0 :(得分:1)

前言

我提出的解决方案是OP问题的推广,因为OP数组只出现了数字13,在这里我讨论了多次出现的可能性。

除了一个解决方案之外,我的所有解决方案都基于列表循环的概念(通过我用于帮助函数的名称rotate更清楚)。

如果有用例(我认为有这样的用例)!如果不欢迎循环的假设,那么使用我的第三段代码,或者更好的是@cel的答案,只要你在访问数组之前测试索引或在try {{1 }。clause。

Code Chunks

except

另一种可能性

>>> import numpy as np
>>> a = np.array([1,2,13,7,3,5])
>>> i = a == 13
>>> print a[np.concatenate(([False],i[:-1]))]
[7]
>>> 

另一个(脆弱,它可以超出>>> print a[np.concatenate((i[-1:],i[:-1]))] [7] >>> 的长度索引,不要使用这个裸格式的最后一个,请参阅前言)

a

你现在有一个数组的可能性......

雅?

>>> print a[np.arange(len(a))[i]+1]
[7]
>>> 

答案 1 :(得分:1)

最简单的方法是使用nonzero。它返回一个数组元组,因此你必须做一些额外的索引:

In [1]: a = np.array([1,2,13,7,3,5])

In [2]: i = a == 13

In [3]: i
Out[3]: array([False, False,  True, False, False, False], dtype=bool)

In [4]: i.nonzero()
Out[4]: (array([2]),)

In [5]: i.nonzero()[0]
Out[5]: array([2])

In [6]: i.nonzero()[0][0]
Out[6]: 2

In [7]: a[i.nonzero()[0][0] + 1]
Out[7]: 7

答案 2 :(得分:1)

我会做以下事情:

import numpy as np
a = np.array([1,2,13,7,3,5])
indices, = np.where(a[:-1] == 13)
print a[indices[0] + 1]

在python3中你也可以这样做:

import numpy as np
a = np.array([1,2,13,7,3,5])
indices, = np.where(a[:-1] == 13)
first_index, *_ = indices
print(a[first_index + 1])

在我看来哪个更具可读性。不幸的是,python2版本不支持扩展的元组解包。

两个版本都要求问题定义明确,并且列表中确实存在13并且它具有前一个版本。 如果这不适用于您的问题,则可以检查indices的长度,如果长度为0,您可能希望以适当的错误终止。

答案 3 :(得分:0)

我认为这是最直接的方式:

import numpy as np

a = np.array([1,2,13,7,3,5])
print a[np.flatnonzero(a == 13) + 1]