python - 有没有办法在 Numpy 的方板上获得“白细胞”/“黑细胞”视图?
问题描述
有没有办法在 Numpy中的某个方形数组上构建两者black
和视图?white
board
当然board
也可以是另一个数组的视图?
我们显然假设棋盘的等级是偶数(就像经典的 8x8 棋盘一样),因为在奇数棋盘上完成所需的任务确实很容易。
尽管我与以下想法非常吻合,但我认为这并不完全可能:
a = np.zeros((81,))
board = a.reshape((9,9))[:8,:8]
black = a[::2]
white = a[1::2]
black += 1
white += 2
print(board)
这几乎可以满足要求:board
内部阵列上有一些 8x8 视图,您可以使用其他两个视图分别初始化黑白单元格。但是这个解决方案并不完美,因为这两个black
和white
视图还包含无用的隐藏单元格。
这个问题有更好的解决方案吗?
这仅仅是同事之间的理论挑战(而不是“你想达到什么目标?”来自某些生产环境的问题)。
解决方案
如果black
并且white
不需要是一维的,则可以这样做:
board = np.zeros((18,12))[::3,::2]
# non contiguous to make it a bit intersting
m,n = board.shape
v4d = board.reshape(m//2,2,n//2,2)
black = np.einsum("ijkj->ijk",v4d)
white = np.einsum("ijkj->ijk",v4d[...,::-1])
board
# array([[0., 0., 0., 0., 0., 0.],
# [0., 0., 0., 0., 0., 0.],
# [0., 0., 0., 0., 0., 0.],
# [0., 0., 0., 0., 0., 0.],
# [0., 0., 0., 0., 0., 0.],
# [0., 0., 0., 0., 0., 0.]])
black += 1
board
# array([[1., 0., 1., 0., 1., 0.],
# [0., 1., 0., 1., 0., 1.],
# [1., 0., 1., 0., 1., 0.],
# [0., 1., 0., 1., 0., 1.],
# [1., 0., 1., 0., 1., 0.],
# [0., 1., 0., 1., 0., 1.]])
white += 2
board
# array([[1., 2., 1., 2., 1., 2.],
# [2., 1., 2., 1., 2., 1.],
# [1., 2., 1., 2., 1., 2.],
# [2., 1., 2., 1., 2., 1.],
# [1., 2., 1., 2., 1., 2.],
# [2., 1., 2., 1., 2., 1.]])
推荐阅读
- jquery - 通过 ajax 发布时 IFormFile 属性获取空值(已使用 enctype="multipart/form-data")
- python - 在 Robot Framework 中测试来自两个不同来源的数据
- excel - 如果在打开文件时执行宏会损坏我的 Excel 文件
- c# - BlockingCollection ToObservable 与订阅使用响应式扩展
- r - 为所有变量的数据框中的每个 id 添加一个新行
- java - 分享 Instagram Story 的贴纸坏了?
- operating-system - 用 yocto 定义新的图像特征
- visual-studio-code - 如何覆盖特定主题的字体?
- ansible - 条件检查 'user_sdf_exist.rc == 0' 失败
- python - 具有弹出值能力的 Nosql 文件数据库