如何在numpy中创建棋盘?

32 投票
29 回答
45344 浏览
提问于 2025-04-15 18:40

我正在使用numpy来初始化一个像素数组,想要做成灰色棋盘格(这通常用来表示“没有像素”或者透明)。我觉得应该有更聪明的方法可以利用numpy强大的数组赋值、切片和切块操作来实现,但我现在想到的就是这个:

w, h = 600, 800
sq = 15    # width of each checker-square
pix = numpy.zeros((w, h, 3), dtype=numpy.uint8)
# Make a checkerboard
row = [[(0x99,0x99,0x99),(0xAA,0xAA,0xAA)][(i//sq)%2] for i in range(w)]
pix[[i for i in range(h) if (i//sq)%2 == 0]] = row
row = [[(0xAA,0xAA,0xAA),(0x99,0x99,0x99)][(i//sq)%2] for i in range(w)]
pix[[i for i in range(h) if (i//sq)%2 == 1]] = row

这个方法是有效的,但我希望能有更简单的做法。

29 个回答

15

这样就可以了

你可以创建任何大小的棋盘(只需要传入宽度和高度,分别用w和h表示);另外,我把每个格子的高度和宽度都固定为1,不过当然也可以把这个设置成参数,这样就可以传入任意值:

>>> import numpy as NP

>>> def build_checkerboard(w, h) :
      re = NP.r_[ w*[0,1] ]              # even-numbered rows
      ro = NP.r_[ w*[1,0] ]              # odd-numbered rows
      return NP.row_stack(h*(re, ro))


>>> checkerboard = build_checkerboard(5, 5)

>>> checkerboard
 Out[3]: array([[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
               [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
               [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
               [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
               [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
               [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
               [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
               [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
               [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
               [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]])

有了这个二维数组,绘制一个棋盘的图像就很简单了,像这样:

>>> import matplotlib.pyplot as PLT

>>> fig, ax = PLT.subplots()
>>> ax.imshow(checkerboard, cmap=PLT.cm.gray, interpolation='nearest')
>>> PLT.show()
24

我会使用克罗内克积kron函数:

np.kron([[1, 0] * 4, [0, 1] * 4] * 4, np.ones((10, 10)))

这个例子中的棋盘有2*4=8个区域,每个区域的大小是10x10。

38
def checkerboard(shape):
    return np.indices(shape).sum(axis=0) % 2

这是最简洁的方案,可能也是最快的,而且还是唯一一个可以扩展到多维度的解决办法。

撰写回答