使用索引(numpy等效的python枚举)迭代numpy

时间:2017-02-07 05:46:58

标签: python numpy

我正在尝试创建一个函数来计算多维numpy数组中元素之间的晶格距离(水平和垂直步长的数量)。为此,我需要在迭代数组时从每个元素的索引中检索实际数字。我想将这些值存储为可以通过距离公式运行的数字。

对于示例数组A

 A=np.array([[1,2,3],[4,5,6],[7,8,9]])

我想创建一个遍历每个元素的循环,对于第一个元素1,它将检索a = 0,b = 0,因为1在A [0,0],然后a = 0,b =元素2为1,因为它位于A [0,1],依此类推......

我想象的输出是数组中每个元素的两个数字(对应于该元素的两个索引值)。所以在上面的例子中,我将分配的两个值是a和b。我只需要在循环中检索这两个数字(而不是单独保存为另一个数据对象)。

对于如何做到这一点的任何想法将不胜感激!

3 个答案:

答案 0 :(得分:7)

您可以使用numpy.ndenumerate遍历数组中的值,以获取数组中值的索引。

使用上面的文档:

A = np.array([[1,2,3],[4,5,6],[7,8,9]])
for index, values in np.ndenumerate(A):
    print(index, values)  # operate here

答案 1 :(得分:1)

另一种可能的解决方案:

import numpy as np

A=np.array([[1,2,3],[4,5,6],[7,8,9]])
for _, val in np.ndenumerate(A):
    ind = np.argwhere(A==val)
    print val, ind

在这种情况下,如果值不在数组中出现,您将获得索引数组。

答案 2 :(得分:1)

您可以使用np.ndenumerate执行此操作,但通常您不需要遍历数组。

您可以简单地创建一个meshgrid(或打开网格)以立即获取所有索引,然后您可以更快地处理它们(矢量化)。

例如

>>> x, y = np.mgrid[slice(A.shape[0]), slice(A.shape[1])]
>>> x
array([[0, 0, 0],
       [1, 1, 1],
       [2, 2, 2]])
>>> y
array([[0, 1, 2],
       [0, 1, 2],
       [0, 1, 2]])

这些可以像任何其他数组一样进行处理。因此,如果您需要索引的函数可以进行矢量化,那么您就不应该进行手动循环!

例如,计算每个点到点(2, 3)的格点距离:

>>> abs(x - 2) + abs(y - 3)
array([[5, 4, 3],
       [4, 3, 2],
       [3, 2, 1]])

对于距离,ogrid会更快。只需将np.mgrid替换为np.ogrid

即可
>>> x, y = np.ogrid[slice(A.shape[0]), slice(A.shape[1])]
>>> np.hypot(x - 2, y - 3)  # cartesian distance this time! :-)
array([[ 3.60555128,  2.82842712,  2.23606798],
       [ 3.16227766,  2.23606798,  1.41421356],
       [ 3.        ,  2.        ,  1.        ]])