python 遍历指定的数组元素

python looping over specified array elements

我正在使用 numpy.ndenumerate 进行数组元素迭代:

a = np.ones((10,10,10))
for (x,y,z), value in numpy.ndenumerate(a):
    do stuff with x,y,z and value

如何只迭代指定的元素值?例如,如果数组是二进制的,我该如何遍历所有数组?

目前我正在使用类似的东西:

specified = np.nonzero(a) #or np.where(a == some_value)
for i in xrange(np.count_nonzero(a)):
    do stuff with x,y,z = specified[0][i], specified[1][i], specified[2][i] 
    and value = a[x,y,z]

这显然很丑陋,我相信有一条不错的捷径。

我没发现 np.nonzero(a) 有什么问题。但是,从 np.nonzero 返回的是一个元素元组,其中元组中的每个元素都是特定维度的非零索引。具体来说,元组的第一个元素是非零的行位置,第二个元素是非零的列位置,第三个元素是非零的切片位置,等等。因此,对于每个元组元素的同一索引中的每个元素分组,您将获得一组坐标,告诉您数组中哪些位置非零。

获得这些后,您可以简单地 zip 处理它们并提取您的值:

specified = np.nonzero(a)
for (x,y,z) in zip(*specified):
     # do your stuff with a[x,y,z] and x,y,z...
     value = a[x,y,z]
     #....
     #....

上面假设specified有三个元组元素对应a是三维的。在循环的每次迭代中,我们获取与 a 中的非零条目相对应的唯一 (x,y,z) 三元组。您可以继续对每个三元组进行处理。


但是,上面的代码假设您要在同一个 for 循环体中对 (x,y,z) 三元组和值本身进行处理。如果您打算只提取值,那么布尔索引是更好的方法。具体来说,你可以这样做:

values = a == some_value

values 将包含一个与 a 大小相同的布尔数组,指示值等于或不等于 some_value 的位置。从那里,你也许可以做这样的事情:

a[values] = some_other_value

这会将 a 中等于 some_value 的所有值替换为 some_other_value。如果您打算简单地访问值并对这些值进行一些操作,那么上面的方法是更好的方法。但是,我不能肯定地说,因为我不知道 "stuff" 你打算在你的 for 循环体内做什么。