我正在尝试列出numpy ndarrays,类似于以下内容:
>>> import numpy as np
>>> a = np.array([1,2,3])
>>> b = 3*[np.copy(a)]
>>> print b
[array([1, 2, 3]), array([1, 2, 3]), array([1, 2, 3])]
但是这个列表的每个元素都是原始数组np.copy(a)
的别名,所以更改任何ndarray的一个元素会改变所有其他相应的元素,即:
>>> b[0][0] = 0
>>> print b
[array([0, 2, 3]), array([0, 2, 3]), array([0, 2, 3])]
如何使这些数组彼此独立,以便上述结果为:
[array([0, 2, 3]), array([1, 2, 3]), array([1, 2, 3])]
答案 0 :(得分:3)
执行3*[np.copy(a)]
实际执行a
的一个副本并创建3个对此副本的引用,这样您就不能只更改一个,因为它们是同一个对象。这样做:
b = [np.copy(a) for i in range(3)]
将创建3个独立副本。
但是你似乎应该使用b作为2D数组,你可以实现:
b = np.vstack((a for i in range(3)))
答案 1 :(得分:3)
你所尝试的不起作用的原因是
>>> b = 3*[np.copy(a)]
基本上等同于
>>> c = np.copy(a)
>>> b = 3*[c]
在Python中,c
不是数组,c
在这种情况下是对数组的引用。 3*[c]
只复制三次引用。你可以做到,
>>> b = [np.copy(a) for i in xrange(3)]
为sgpc mentions,或者你甚至可以做,
>>> b = [np.array([1,2,3]) for i in xrange(3)]