numpy multiple ndarray一次创建

时间:2012-09-07 13:37:04

标签: python numpy

我想用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的探测器方法是什么?

2 个答案:

答案 0 :(得分: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来节省创建列表的开销......)

答案 1 :(得分:3)

不使用列表推导或生成器的另一种解决方案是:

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

所以,如果您需要,例如形状为(5, 5)的三个数组:

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

为了更好地解释原始例子中出现的问题,我参考了mgilson的回答。