2017-05-10 6 views
-1

Anacondaを使用して、簡単なコードを書いています。私は配列がforループでどのように書き直されているか把握しようとしています。それは定義されています。私はボックスという名前の配列(ランダム0または1)を書いて、私は一人で残したい配列の「コピー」として新しい配列ホルダーを定義します。しかし、箱は書き直され続けており、どうやってこれをやるべきか分かりません。Pythonのnumpy配列がループで書き直されている - これをしないでください。

#FUNCTIONS 

def initialize(): 
    config = np.zeros([n, n]) 
    for x in range(n): 
     for y in range(n): 
      if np.random.rand() < p: 
       config[x, y] = 1 
    return config 

def roller(x): 
    test1 = np.roll(x,1,axis=0) 
    test2 = np.roll(x,1,axis=1) 
    test3 = np.roll(x,-1,axis=1) 
    test4 = np.roll(x,-1,axis=0) 
    hold = np.sum([test1,test2,test3,test4],axis=0) 
    return hold 

def loop(steps,holder,store_config): 
    for t in range(steps): 
     tot = roller(holder) 
     for x in range(n): 
      for y in range(n): 
       if tot[x,y] >= 4: 
        holder[x,y] = 1 
       else: 
        holder[x,y] = 0 
     store_config[:,:,t] = holder 

def func(): 
    start = time.time() 
    time_steps = 20 
    store_config = np.zeros([n,n,time_steps]) 
    loop(time_steps,holder,store_config) 
    end = time.time() 
    print(end - start, np.sum(store_config)) 

#CONSTANTS 

n = 100 
p = .2 
box = initialize() #Array to leave ALONE 
print(np.sum(box)) 

#Action 
holder = box #Array to manipulate and redefine as box 
func() 
print(np.sum(box)) 

はあなたの場合はnp.sum(ボックス)の出力からの値が走っている()の前と後のFUNCと一致する必要がありますが、彼らは決してしません。その意図は、func()を再実行すると値が吐き出されるが、同じ定義された "box"配列を反復するだけだが、書き直され続けるということである。私はその可能性を見ていない。私は配列がグローバルではない関数の中で変数のように扱われていると思いましたか? #Functions、#Constant、#Actionの3つのセクションのそれぞれは、Condaノートブックの独自のセルになります。

+0

'ホルダー[X、Y] = '1'、'ホルダー[X、Y] = 0 'をあなたのループに。 – Evey

答えて

1

私はあなたが持っている問題は、リストと辞書と同様に、参照によって割り当てられるということです。これは、変数の代入であるか関数に渡される引数であるかに関係なく発生します。 xを操作した後、返されるので

def f(x): 
    x[0] = 0 
    return x 

a = array([1, 1]) 
b = f(a) 

は、aと等しいbをもたらすであろう。あなたがa保持したい場合は、最初の配列をコピーする必要があります。

def f(x): 
    x_ = x.copy() 
    x[0] = 0 
    return x 

を私はこれは少し物事を明確に願っています。 :-)

0

holder = boxは、配列の新しいコピーを作成しません。holderは、boxと同じ配列を指します。コードでholderが変更されているため、holderは、上書きされないようにboxのコピーを指します。あなたは、のようにnp.copy()を使用してこれを行うことができます。

私が見る
holder = np.copy(box) 
関連する問題