我使用numpy将一个像素数组初始化为一个灰色棋盘格(“无像素”的经典表示法,即透明)。似乎应该有一种奇妙的方法来实现numpy令人惊叹的数组赋值/分片/分割操作,但这是我想出的最好的方法:
w, h = 600, 800
sq = 15 # width of each checker-square
self.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)]
self.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)]
self.pix[[i for i in range(h) if (i//sq)%2 == 1]] = row它是有效的,但我希望有更简单的东西。
发布于 2018-08-07 04:54:35
def checkerboard(shape):
return np.indices(shape).sum(axis=0) % 2最紧凑,可能是最快的,也是唯一发布的推广到n维的解决方案。
发布于 2016-05-25 22:27:28
我会用Kronecker product kron
np.kron([[1, 0] * 4, [0, 1] * 4] * 4, np.ones((10, 10)))本例中的棋盘在每个方向上都有大小为10x10的2*4=8字段。
发布于 2010-01-31 05:37:50
这应该就行了
任意大小的棋盘格(只需传入width和height,如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]])使用这个2D数组,可以很容易地渲染棋盘的图像,如下所示:
>>> import matplotlib.pyplot as PLT
>>> fig, ax = PLT.subplots()
>>> ax.imshow(checkerboard, cmap=PLT.cm.gray, interpolation='nearest')
>>> PLT.show()https://stackoverflow.com/questions/2169478
复制相似问题