2017-02-16 7 views
0

PythonでArraysがどのように機能するかを理解する上で問題があります。Pythonの配列を理解する

私はこの短いデモコードを書いた:

from numpy import zeros 

a = zeros((3), 'd') 
b = zeros((2,3), 'd') 
for i in range(2): 
    for j in range(3): 
     a[j] = i*j 
    b[i] = a 
print "A: " + str(a) + "\n" 
print "B: " + str(b) 

これの出力は次のとおりです。だからここ

A: [ 0. 1. 2.] 
B: [[ 0. 0. 0.] [ 0. 1. 2.]] 

は私の質問です。なぜ、このために出力されません。

A: [ 0. 1. 2.] 
B: [[ 0. 1. 2.] [ 0. 1. 2.]] 

私は同じaに変更を加えて、配列のアドレスが変更されていないので。

+0

あなたが範囲内のiについてA' –

+0

''とサブリストB'すべての 'の参照を変更したため(2)' - >あなたの最初のループは値 '私は= 0 '、設定が特徴全ての 'j ' - >' b [0] = [0。 0. 0.] ' – asongtoruin

+0

はい、それは同じアドレスです。 bのすべてのサブリスト同じアドレスを指します。最終的に値は最後に配列に書き込まれるかどうかです。 –

答えて

1

あなたが

b[i] = a 

baへの参照を挿入することを想定しているように見えます。そうではありません。配列スライスに代入するとデータがコピーされます。この動作は、リストを使用したスライス割り当てに似ています。

多分、混乱はそれとは違っていますか?

a = b[i] 

コピーしないと、ビューが作成されます。これは、スライスの一覧とは異なります。

+0

ああです。私はJavaやC++のようなものだと思っていました。ありがとうございました! –

0

その[0. 0. 0]ので:

[J] = 0 * J:最初のループは、あなたが "私" がゼロのために持っている "0" で始まる

0を掛けたものはすべてゼロです。

+0

への参照を含んでいません。私の問題は次のとおりです。2番目の反復では、配列[a]に値[0,1,2]を書き込みます。今、aのアドレスが0x2Aだとしましょう。したがって、b [0]はアドレス0x2Aを指し、b [1]はアドレス0x2Aも指し示します。そして、0x2Aは配列aであり、aの最後のエントリは[0,1,2]でした。したがって、bの内容は[[0,1,2]、[0,1,2]] –

0

配列はあなたが期待しているような動作をしませんが、リストは表示されます。私たちが行列を使用する場合は、

import numpy as np 

a = np.zeros(3, 'd') 
b = np.zeros(3, 'd') 
c = np.zeros((2,3), 'd') 

c[0] = a 
c[1] = b 

a[1] = 2 
b[0] = 1 

print 'Matrix A: {}'.format(a) 
print 'Matrix B: {}'.format(b) 
print 'Matrix C: {}'.format(c) 

a = [0, 0, 0] 
b = [0, 0, 0] 
c = [a, b] 

a[1] = 2 
b[0] = 1 

print 'List A: {}'.format(a) 
print 'List B: {}'.format(b) 
print 'List C: {}'.format(c) 

c[0]コピーaの現在値、c[1]bのために同じことを行います。次の例を参照してください。参照が失われるため、abの変更はcには影響しません。したがって、我々は印刷:

Matrix A: [ 0. 2. 0.] 
Matrix B: [ 1. 0. 0.] 
Matrix C: [[ 0. 0. 0.] 
[ 0. 0. 0.]] 

しかしリストのために、参照が保持されています。そこで、我々は印刷:

List A: [0, 2, 0] 
List B: [1, 0, 0] 
List C: [[0, 2, 0], [1, 0, 0]]