python循环遍历指定的数组元素

时间:2015-08-12 16:01:04

标签: python arrays numpy iteration

我正在使用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]

这显然是非常难看的,我很有希望有一个很好的短路。

1 个答案:

答案 0 :(得分:1)

我发现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三元组的元组元素。在循环的每次迭代中,我们获取与(x,y,z)中的非零条目对应的唯一a三元组。您可以继续对每个三元组进行处理。

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

values = a == some_value

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

a[values] = some_other_value

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