0

我想用 numpy.zeros((N,M)) 创建多个矩阵。但我刚刚意识到这并不像我想象的那样工作:

有人可以向我解释以下代码的结果(为简单起见,使用 1dim 数组):

#!/usr/bin/python
import numpy as np

#sequential array creation 
X=np.zeros(1)
Y=np.zeros(1)
X[0],Y[0]=1.0,2.0
print X,Y

#multiple array creation
X,Y=[np.zeros(1)]*2
X[0],Y[0]=1.0,2.0
print X,Y

结果是

[1.] [2.]

[2.] [2.]

这意味着创建数组的第二种方法不起作用......

在 1 行中创建许多具有相同尺寸的 ndarray 的探测方法是什么?

4

2 回答 2

4
mylist * 2

相当于

mylist + mylist #resulting list has 2 references to each element in mylist 
                #stored as:
                #[mylist[0],mylist[1],...,mylist[0],mylist[1],...]
                #   ^ ----------------------^
                #   reference the same object

因此,在您的情况下,您正在制作一个 numpy 数组,然后将其放入列表中。当您将该列表相乘时,结果列表有 2 个对同一数组的引用。

如果你想创建多个数组并将它们放在一个列表中,列表推导就可以了:

lst_of_arrays = [ np.zeros(1) for _ in range(N) ]

或者,如果它们的解包数量足够少,您可以使用生成器或列表理解(下面我选择生成器):

X,Y = ( np.zeros(1) for _ in range(2) )
X,Y,Z = ( np.zeros(1) for _ in range(3) )
W,X,Y,Z = ( np.zeros(1) for _ in range(4) )
...

(并且,为了避免不可避免的评论,在 python2.x 中,您可以使用xrange而不是range来节省创建列表的开销......)

于 2012-09-07T13:41:44.887 回答
3

另一个不使用列表理解或生成器的解决方案是:

X, Y = np.zeros((2,1))

因此,如果您需要例如三个形状数组,(5, 5)它将是:

X, Y, Z = np.zeros((3, 5, 5))

为了很好地解释原始示例中出了什么问题,我参考了 mgilson 的回答。

于 2012-09-07T14:23:38.840 回答