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