2017-07-19 36 views
0

試圖讓我的代碼更有效率和可讀性,我卡住了。假設我想要構建像棋盤一樣的東西,在8x8網格上交替顯示黑色和白色。因此,使用numpy的,我已經做到了這一點:numpy中的交替值

import numpy as np 
board = np.zeros((8,8), np.int32) 
for ri in range(8): 
    for ci in range(8): 
      if (ci + ri) % 2 == 0: 
        board[ri,ci] = 1 

這很好地輸出:

array([[1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1]], dtype=int32) 

那我就可以解析爲白色方塊或黑色方塊。但是,在實踐中,我的數組要大得多,而且這種方式效率很低且不可讀。我以爲numpy的已經有這個想通了,所以我嘗試這樣做:

board = np.zeros(64, np.int32) 
board[::2] = 1 
board = board.reshape(8,8) 

但是,輸出是錯誤的,是這樣的:

array([[1, 0, 1, 0, 1, 0, 1, 0], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [1, 0, 1, 0, 1, 0, 1, 0]], dtype=int32) 

有沒有更好的方式來實現我想要的有效地工作(並且最好是可讀的)?

注:我沒有連接到1和0的,這可以很容易地與其它類型的值,即使真/假或2種串完成的,只要它的作品

+0

相關:[如何使棋盤在numpy?](https://stackoverflow.com/q/2169478/190597) – unutbu

回答

3

下面是使用一種方法slicing在兩個步驟正確啓動和2步長 -

board = np.zeros((8,8), np.int32) 
board[::2,::2] = 1 
board[1::2,1::2] = 1 

採樣運行 -

In [229]: board = np.zeros((8,8), np.int32) 
    ...: board[::2,::2] = 1 
    ...: board[1::2,1::2] = 1 
    ...: 

In [230]: board 
Out[230]: 
array([[1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1]], dtype=int32) 

其他棘手的方式 -

1)及播放比較:

In [254]: r = np.arange(8)%2 

In [255]: (r[:,None] == r)*1 
Out[255]: 
array([[1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1]]) 

2)及播放另外:

In [279]: r = np.arange(8) 

In [280]: 1-(r[:,None] + r)%2 
Out[280]: 
array([[1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1]]) 
+0

好的解決方案,我將不得不更多地研究廣播的解決方案瞭解他們 –

+0

我還發現了另一種選擇,所以我會張貼另一個答案,但我仍然標記爲你,因爲它對我更有用 –

1

剛剛發現我自己的備選答案,所以在這裏張貼供將來參考的人誰的興趣:

a = np.array([[1,0],[0,1]]) 
b = np.tile(a, (4,4)) 

結果:

array([[1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1], 
     [1, 0, 1, 0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0, 1, 0, 1]])