是否有一种方法可以在Numpy中的某个正方形数组black
上构建两个white
和board
视图?
当然board
本身也可以是另一个数组的视图吗?
我们显然认为棋盘的 rank 是偶数的(就像经典的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
视图也包含无用的隐藏单元格。
这个问题有更好的解决方案吗?
这仅仅是同事之间的理论挑战(而不是某个生产环境中的“您要达到什么目标?”问题。)
答案 0 :(得分:4)
如果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.]])
答案 1 :(得分:0)
我认为您的预感是不可能的。
如果您的board
本身不是视图,则很容易获得可以对其进行操作的视图:
>>> board = np.zeros((8, 8), int)
>>> black = board.ravel()[::2]
>>> black.base is board # is black a view of board?
True
如果board
是a
的视图,则不会以可以获取所需视图的方式对齐内存,因此ravel
会创建副本:< / p>
>>> 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