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
循环体内做什么。
我正在使用 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
循环体内做什么。