2

我正在尝试制作一个 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])]
4

2 回答 2

3

Doing3*[np.copy(a)]实际上会创建一个副本a并创建 3 个对该副本的引用,因此您不能只更改一个,因为它们是同一个对象。这样做:

b = [np.copy(a) for i in range(3)]

将创建 3 个独立副本。

但似乎您应该将 b 作为二维数组使用,您可以这样做:

b = np.vstack((a for i in range(3)))
于 2013-06-19T18:42:37.497 回答
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 提到的,或者你甚至可以这样做,

>>> b = [np.array([1,2,3]) for i in xrange(3)]
于 2013-06-19T18:53:58.027 回答