2011-11-09 33 views
2

這是上一個計算器問題hereSciPy的 - 格子的結構,它捕獲分子在2D層面

我想這樣做,在2個維度的延續。 我試過如下:

for i in range(pos): 
    steps=0 #the steps that the particle does until it falls in a trap 
    in_pos = sc.random.randint(0, len(grid), 2) 
    initial_trap=False 
    while initial_trap==False: 
     #the step of the particle can be one of this 
     step=sc.array(random.choice([[0, 1], [1, 0], [0, -1], [-1, 0]]))   
     # Check position for edges and fix if required 

     if in_pos + step > sc.size(grid) - 1: 
      in_pos = 0 
     elif in_pos + step < 0: 
      in_pos = sc.size(grid) - 1 
     else: 
      in_pos += step 


     # Check if it's a trap in order to stop the loop 

     if grid[in_pos] == 0: 
      initial_trap = True 

     # If it isn't a trap, continue 
     steps+=1 
    steps_count.append(steps) 
return steps_count 

我也試過:

in_pos_x =int(sc.random.randint(0, len(grid), 1)) #initial position of particle in x axis 
in_pos_y =int(sc.random.randint(0, len(grid), 1)) #initial position of particle in y axis 

if in_pos_x + step > len(grid)- 1 and in_pos_y + step > len(grid)-1: 
    in_pos_x = 0 
    in_pos_y = 0 
elif in_pos_x + step < 0 and in_pos_y + step < 0: 
    in_pos_x = len(grid)- 1 
    in_pos_y = len(grid)- 1 
else: in_pos_x += step 
    in_pos_y += step 

if grid[in_pos_x][in_pos_y] == 0: 
    initial_trap = True 

而在去年,我試着用列表,而不是陣列工作。

in_pos = (scipy.random.randint(0,len(grid),2)).tolist() 
step=random.choice([[0, 1], [1, 0], [0, -1], [-1, 0]]) 

但是沒有成功。 我迷失在這裏!

---------------錯誤消息-----------------------------

如果運行它,它給了我:

「超過一個元素的數組的真值是不明確的。使用a.any()或a.all()」在該行 「如果(in_pos +工序)> sc.size(網格) - 1:」

如果我使用if sc.any(in_pos + step) > sc.size(grid) - 1:或它運行if sc.any(grid[in_pos]) == 0:但我使用的print(grid[in_pos]),我發現它根本不會改變數值!它沒有得到值'0',所以循環永遠不會結束。

+0

如果你告訴*什麼*不工作會更好。 – Avaris

+0

'step = sc.array(random.choice([[0,1],[1,0],[0,-1],[-1,0]])''' – George

+1

'仍然會做得更好。 「不工作」=?拋出異常?在這種情況下,分享這個例外。不按照你的意圖做?在這種情況下,分享它的作用和目標。 – Avaris

回答

3

評論後,我想我明白你要去哪裏。

我猜你是使用定期邊界,但你如下做檢查是錯誤的:

# Check position for edges and fix if requireD 

if in_pos + step > sc.size(grid) - 1: 
    in_pos = 0 
elif in_pos + step < 0: 
    in_pos = sc.size(grid) - 1 
else: 
    in_pos += step 

size返回數組中元素的總數。您需要檢查陣列的各個長度(在xy方向)。在這裏,shape是你的朋友。你需要糾正超出限制的索引,而不是全部。 mod運營商%可以使用。所以上面的代碼可以被簡單地重新寫爲:

# Move by step 
in_pos += step 
# Correct according to periodic boundaries 
in_pos = in_pos % grid.shape # or simply in_pos %= grid.shape 

第二個問題的grid索引。可以這麼說,你所做的並不是你想要的(check the docs for details)。對於你的簡單情況,它可以被重寫爲:

if grid[in_pos[0], in_pos[1]] == 0: 
    initial_trap = True 
+0

:好吧,我認爲它的權利。我會明天測試它。我只是不明白in_pos%grid.shape是如何工作的。它等同於「if in_pos + step> len(grid) - 1 ....」我想將它應用到1維,它將是「in_pos = in_pos%len(grid)?或len(grid)-1?但是我仍然不明白模數 – George

+0

@George:假設你有一個3x3的網格。在[1,2](這是第二行的結尾),你想要向右([+ 0,+ 1])。你將會得到的是[1,3],但那是超出界限的。所以你需要從左側返回(即週期性邊界),並在[1,0]。 grid.shape給你[3,3]。 %與一個數組將給你與每個相應的元素的MOD。所以[1,3]%[3,3] == [1%3,3%3] == [1,0]。一般而言,%n在[0,n-1]中給你一些東西,所以它在週期性的東西中很有用。 – Avaris

+0

:好的,謝謝,我現在明白了。但是,它現在迷惑了我現在的1維。相當於in_pos%= len(grid)-1?再次感謝! – George