有没有一种方法可以在Numpy的正方形板上看到“白色单元格”/“黑色单元格”的视图?

2024-03-28 13:11:59 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法在Numpy中的某个正方形数组board上构建两个blackwhite视图?你知道吗

当然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视图,您可以使用另外两个视图分别初始化黑白单元格。但是这个解决方案并不完美,因为两个blackwhite视图也包含无用的隐藏单元。你知道吗

这个问题有更好的解决办法吗?你知道吗

这只是同事之间的理论上的挑战(而不是“你想达到什么目的?”来自生产环境的问题)。


Tags: numpyboard视图棋盘npzeros数组black
2条回答

如果blackwhite不需要是1D,可以这样做:

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.]])

我认为你不可能的预感是正确的。你知道吗

如果您的board本身不是一个视图,那么很容易获得您可以操作的视图:

>>> board = np.zeros((8, 8), int)
>>> black = board.ravel()[::2]
>>> black.base is board # is black a view of board?
True

如果boarda的视图,则内存不会以您可以获得所需视图的方式对齐,因此ravel将创建副本:

>>> a = np.zeros(81)
>>> board = a.reshape(9, 9)[:8, :8]
>>> board.base is a # is board a view of a?
True
>>> black = board.ravel()[::2]
>>> black.base in (a, board) # is black a view of a or board?
False

我能想到的一个解决方法是将每个视图分成两个:

>>> black0 = board[::2, ::2]
>>> black1 = board[1::2, 1::2]
>>> black0.base is a and black1.base is a # are both views of a?
True

相关问题 更多 >