如何在python中使用循环为ndarray变量赋值
定义了一个数据类型为对象的数据数组如何在python中使用循环为ndarray变量赋值,python,python-2.7,numpy,multidimensional-array,Python,Python 2.7,Numpy,Multidimensional Array,定义了一个数据类型为对象的数据数组a,并用字典填充它 这是a array([[[{'position': (0, 0, 0)}, {'position': (0, 0, 0)}, {'position': (0, 0, 0)}, {'position': (0, 0, 0)}], [{'position': (0, 0, 0)}, {'position': (0, 0, 0)}, {'position': (0, 0, 0)}, {'position': (0, 0,
a
,并用字典填充它
这是a
array([[[{'position': (0, 0, 0)}, {'position': (0, 0, 0)},
{'position': (0, 0, 0)}, {'position': (0, 0, 0)}],
[{'position': (0, 0, 0)}, {'position': (0, 0, 0)},
{'position': (0, 0, 0)}, {'position': (0, 0, 0)}],
[{'position': (0, 0, 0)}, {'position': (0, 0, 0)},
{'position': (0, 0, 0)}, {'position': (0, 0, 0)}]],
[[{'position': (0, 0, 0)}, {'position': (0, 0, 0)},
{'position': (0, 0, 0)}, {'position': (0, 0, 0)}],
[{'position': (0, 0, 0)}, {'position': (0, 0, 0)},
{'position': (0, 0, 0)}, {'position': (0, 0, 0)}],
[{'position': (0, 0, 0)}, {'position': (0, 0, 0)},
{'position': (0, 0, 0)}, {'position': (0, 0, 0)}]]], dtype=object)
我想将字典中的每个元组替换为一个元组(X-index,Y-index,Z-index)。我尝试numpy.ndenumerate
循环赋值,如下代码所示
for (x_index, y_index, z_index), temp in np.ndenumerate(a):
a[x_index][y_index][z_index]['position'] = (x_index, y_index, z_index)
每个元组被分配到最新的值(1,2,3)。a
的值为
array([[[{'position': (1, 2, 3)}, {'position': (1, 2, 3)},
{'position': (1, 2, 3)}, {'position': (1, 2, 3)}],
[{'position': (1, 2, 3)}, {'position': (1, 2, 3)},
{'position': (1, 2, 3)}, {'position': (1, 2, 3)}],
[{'position': (1, 2, 3)}, {'position': (1, 2, 3)},
{'position': (1, 2, 3)}, {'position': (1, 2, 3)}]],
[[{'position': (1, 2, 3)}, {'position': (1, 2, 3)},
{'position': (1, 2, 3)}, {'position': (1, 2, 3)}],
[{'position': (1, 2, 3)}, {'position': (1, 2, 3)},
{'position': (1, 2, 3)}, {'position': (1, 2, 3)}],
[{'position': (1, 2, 3)}, {'position': (1, 2, 3)},
{'position': (1, 2, 3)}, {'position': (1, 2, 3)}]]], dtype=object)
如何获得所需的输出
array([[[{'position': (0, 0, 0)}, {'position': (0, 0, 1)},
{'position': (0, 0, 2)}, {'position': (0, 0, 3)}],
[{'position': (0, 1, 0)}, {'position': (0, 1, 1)},
{'position': (0, 1, 2)}, {'position': (0, 1, 3)}],
[{'position': (0, 2, 0)}, {'position': (0, 2, 1)},
{'position': (0, 2, 2)}, {'position': (0, 2, 3)}]],
[[{'position': (1, 0, 0)}, {'position': (1, 0, 1)},
{'position': (1, 0, 2)}, {'position': (1, 0, 3)}],
[{'position': (1, 1, 0)}, {'position': (1, 1, 1)},
{'position': (1, 1, 2)}, {'position': (1, 1, 3)}],
[{'position': (1, 2, 0)}, {'position': (1, 2, 1)},
{'position': (1, 2, 2)}, {'position': (1, 2, 3)}]]], dtype=object)
这是一个参照复制问题。您更新一个字典,每隔一个字典将使用相同的值更新一次。这就是为什么每个值都是
{'position':(1,2,3)}
,因为它是最后一次更新。要解决此问题,请每次创建新词典
>>> a = np.ndarray(shape=(2,3,4), dtype=object)
>>> for (x_index, y_index, z_index), temp in np.ndenumerate(a):
... a[x_index][y_index][z_index] = {'position':(x_index, y_index, z_index)}
...
>>> a
array([[[{'position': (0, 0, 0)}, {'position': (0, 0, 1)},
{'position': (0, 0, 2)}, {'position': (0, 0, 3)}],
[{'position': (0, 1, 0)}, {'position': (0, 1, 1)},
{'position': (0, 1, 2)}, {'position': (0, 1, 3)}],
[{'position': (0, 2, 0)}, {'position': (0, 2, 1)},
{'position': (0, 2, 2)}, {'position': (0, 2, 3)}]],
[[{'position': (1, 0, 0)}, {'position': (1, 0, 1)},
{'position': (1, 0, 2)}, {'position': (1, 0, 3)}],
[{'position': (1, 1, 0)}, {'position': (1, 1, 1)},
{'position': (1, 1, 2)}, {'position': (1, 1, 3)}],
[{'position': (1, 2, 0)}, {'position': (1, 2, 1)},
{'position': (1, 2, 2)}, {'position': (1, 2, 3)}]]], dtype=object)
>>> a = np.ndarray(shape=(2,3,4), dtype=object)
>>> for (x_index, y_index, z_index), temp in np.ndenumerate(a):
... a[x_index][y_index][z_index] = {'position':(x_index, y_index, z_index)}
...
>>> a
array([[[{'position': (0, 0, 0)}, {'position': (0, 0, 1)},
{'position': (0, 0, 2)}, {'position': (0, 0, 3)}],
[{'position': (0, 1, 0)}, {'position': (0, 1, 1)},
{'position': (0, 1, 2)}, {'position': (0, 1, 3)}],
[{'position': (0, 2, 0)}, {'position': (0, 2, 1)},
{'position': (0, 2, 2)}, {'position': (0, 2, 3)}]],
[[{'position': (1, 0, 0)}, {'position': (1, 0, 1)},
{'position': (1, 0, 2)}, {'position': (1, 0, 3)}],
[{'position': (1, 1, 0)}, {'position': (1, 1, 1)},
{'position': (1, 1, 2)}, {'position': (1, 1, 3)}],
[{'position': (1, 2, 0)}, {'position': (1, 2, 1)},
{'position': (1, 2, 2)}, {'position': (1, 2, 3)}]]], dtype=object)