首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在numpy中做一个棋盘?

如何在numpy中做一个棋盘?
EN

Stack Overflow用户
提问于 2010-01-31 05:19:53
回答 23查看 29.7K关注 0票数 30

我使用numpy将一个像素数组初始化为一个灰色棋盘格(“无像素”的经典表示法,即透明)。似乎应该有一种奇妙的方法来实现numpy令人惊叹的数组赋值/分片/分割操作,但这是我想出的最好的方法:

代码语言:javascript
运行
复制
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

它是有效的,但我希望有更简单的东西。

EN

回答 23

Stack Overflow用户

发布于 2018-08-07 04:54:35

代码语言:javascript
运行
复制
def checkerboard(shape):
    return np.indices(shape).sum(axis=0) % 2

最紧凑,可能是最快的,也是唯一发布的推广到n维的解决方案。

票数 29
EN

Stack Overflow用户

发布于 2016-05-25 22:27:28

我会用Kronecker product kron

代码语言:javascript
运行
复制
np.kron([[1, 0] * 4, [0, 1] * 4] * 4, np.ones((10, 10)))

本例中的棋盘在每个方向上都有大小为10x10的2*4=8字段。

票数 21
EN

Stack Overflow用户

发布于 2010-01-31 05:37:50

这应该就行了

任意大小的棋盘格(只需传入width和height,如w,h);我还将单元格的高度/宽度硬编码为1,当然这也可以被参数化,以便传入任意值:

代码语言:javascript
运行
复制
>>> 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数组,可以很容易地渲染棋盘的图像,如下所示:

代码语言:javascript
运行
复制
>>> import matplotlib.pyplot as PLT

>>> fig, ax = PLT.subplots()
>>> ax.imshow(checkerboard, cmap=PLT.cm.gray, interpolation='nearest')
>>> PLT.show()
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2169478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档