如何在numpy中创建棋盘?
我正在使用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
这是最简洁的方案,可能也是最快的,而且还是唯一一个可以扩展到多维度的解决办法。