numpy 中的交替值

Ofe*_*dan 2 python numpy

试图让我的代码更加高效和可读,但我陷入了困境。假设我想构建一个类似棋盘的东西,在 8x8 网格上交替黑白颜色。所以,使用 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
Run Code Online (Sandbox Code Playgroud)

很好地输出:

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)
Run Code Online (Sandbox Code Playgroud)

然后我可以将其解析为白色方块或黑色方块。然而,实际上我的数组要大得多,这种方式非常低效且不可读。我假设 numpy 已经解决了这个问题,所以我尝试了这个:

board = np.zeros(64, np.int32)
board[::2] = 1
board = board.reshape(8,8)
Run Code Online (Sandbox Code Playgroud)

但这个输出是错误的,看起来像这样:

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)
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来实现我想要的有效工作(并且最好是可读的)?

注意:我不依赖于 1 和 0,这可以很容易地用其他类型的值来完成,甚至 True/False 或 2 种字符串,只要它有效

Div*_*kar 5

这是一种使用slicing正确的开始和2两步步长的方法 -

board = np.zeros((8,8), np.int32)
board[::2,::2] = 1
board[1::2,1::2] = 1
Run Code Online (Sandbox Code Playgroud)

样本运行 -

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)
Run Code Online (Sandbox Code Playgroud)

其他棘手的方法 -

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]])
Run Code Online (Sandbox Code Playgroud)

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]])
Run Code Online (Sandbox Code Playgroud)