Skip to main content
 首页 » 编程设计

python之numpy 中的交替值

2025年05月04日13zhwl

试图让我的代码更高效和可读,但我被卡住了。假设我想构建类似棋盘的东西,在 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 

哪个很好地输出:

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) 

然后我可以将其解析为白色方 block 或黑色方 block 。但是,实际上我的数组要大得多,这种方式效率很低且不可读。我假设 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,这可以很容易地用其他类型的值来完成,即使是 True/False 或 2 种字符串,只要它有效

请您参考如下方法:

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

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

sample 运行-

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]])