2017-02-04 8 views
0

私はMATLABユーザーです。 は、次のMATLABスクリプトがダイナミックスndarrayで悩む

a = [] 
for i=1:10 
    for j=1:10 
     a(i,j) = i*j 
    end 
end 

について動的np.ndarraysを使用している質問をPythonのためのポートへの最も簡単な方法は何ですか。 MATLABでは、サイズを知らずにa = []を使って一般的なndarrayを初期化してから、明示的なインデックス付けa(i、j)を使用することができます。 Pythonには.appendメソッドがありますが、ndarraysを使うと混乱してしまいます。なぜなら、まず行の要素をパックしてから、行同士をパックしたり、同様の方法でパックする必要があるからです。私は明示的なインデックス作成が好きです。ダイナミックアレイでこれを実現することは可能でしょうか、それとも固定サイズのアレイで行うことはできますか?

ありがとうございます!ディスプレイの

+0

forループと動的割り当ては、PythonのようにMatlabでは悪いことです。 – UpSampler

+0

それを繰り返す必要がある場合は、 'a = np.zeros((10,10)、dtype = int)'で始まります。 – hpaulj

+0

MATLABの配列は実際には動的ではありません。 numpy配列と同様に、新しい配列を作成せずにすべてのデータをコピーすることなく、MATLAB配列のサイズを変更することはできません。それは、MATLABがnumpyがそうでない間にサイズを変更しようとしているということだけです。 – TheBlackCat

答えて

2

ルックあなたはMATLABを実行

オクターブで
a = 1 
a = 
    1 2 
a = 
    1 2 3 
a = 
    1 2 3 4 
.... (so on for 100 iterations) 

私が行うことができます。

>> i=1:10 
i = 

    1 2 3 4 5 6 7 8 9 10 

>> j=(1:10)' 
j = 

    1 
    2 
    3 
    4 
    5 
    6 
    7 
    8 
    9 
    10 

>> a=i+j 
a = 

    2 3 4 5 6 7 8 9 10 11 
    3 4 5 6 7 8 9 10 11 12 
    4 5 6 7 8 9 10 11 12 13 
    5 6 7 8 9 10 11 12 13 14 
    6 7 8 9 10 11 12 13 14 15 
    7 8 9 10 11 12 13 14 15 16 
    8 9 10 11 12 13 14 15 16 17 
    9 10 11 12 13 14 15 16 17 18 
    10 11 12 13 14 15 16 17 18 19 
    11 12 13 14 15 16 17 18 19 20 

これは放送を利用した、コンセプトはnumpyの

In [500]: i=np.arange(1,11) 
In [501]: a = i[:,None] + i 
In [502]: a 
Out[502]: 
array([[ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 
     [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 
     [ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 
     [ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], 
     [ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 
     [ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 
     [ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], 
     [ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], 
     [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], 
     [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]]) 
から借用します

これはベストプラクティスです - numpyではMATLABとOctaveと言っています。

しかし、もしあなたが繰り返しを使用する必要がある場合

In [503]: a=np.zeros((10,10),int) 
In [504]: for i in range(10): 
    ...:  for j in range(10): 
    ...:   a[i,j]=i+j 

それとも本格的なPythonのリストを繰り返し処理と同じような何かを:

In [512]: alist = [] 
In [513]: for i in range(10): 
    ...:  sublist=[] 
    ...:  for j in range(10): 
    ...:   sublist.append(i+j) 
    ...:  alist.append(sublist) 
    ...:  
In [514]: alist 
Out[514]: 
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14], 
[6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 
[7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 
[8, 9, 10, 11, 12, 13, 14, 15, 16, 17], 
[9, 10, 11, 12, 13, 14, 15, 16, 17, 18]] 
In [515]: np.array(alist) 
Out[515]: 
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
     [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 
     [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 
     [ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 
     [ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], 
     [ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 
     [ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 
     [ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], 
     [ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]]) 

が、私は

alist=[[i+j for i in range(10)] for j in range(10)] 

でよりコンパクトalistを生成することができますリストのリストを作成するときは、すべてのサブリストに同じlengそれ以外の場合は、質問に応じてSOに戻ってきます。

関連する問題