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

the result is

[ 1.] [ 2.]

[ 2.] [ 2.]

this means the second method to create the arrays does not work...

What is the prober way to create many ndarrays with identical dimensions in 1 line?

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))

たとえば、形状の 3 つの配列が必要な場合は、次のよう(5, 5)になります。

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

元の例で何がうまくいかなかったのかについての良い説明については、mgilson の回答を参照してください。

于 2012-09-07T14:23:38.840 に答える