生成唯一的numpy数组列表

时间:2013-06-19 18:41:32

标签: python numpy

我正在尝试列出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])]

2 个答案:

答案 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)]