我正在使用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]
这显然是非常难看的,我很有希望有一个很好的短路。
答案 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
循环体内进行操作。