【问题标题】:python looping over specified array elementspython循环遍历指定的数组元素
【发布时间】:2015-11-05 08:36:41
【问题描述】:

我正在使用 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”进行操作的好方法是使用布尔掩码:I = a==1a[I] 是这些值的平面数组; a[I]=... 为这些元素分配新值。

标签: python arrays numpy iteration


【解决方案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 循环体内做什么“东西”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    相关资源
    最近更新 更多