Python中按值嵌套的列表理解样式(国际象棋样式)

Python中按值嵌套的列表理解样式(国际象棋样式),python,numpy,matplotlib,Python,Numpy,Matplotlib,我有一个列表(8x8),如下所示: array([[ 1, 2, 3, 4, 5, 6, 7, 8], [ 9, 10, 11, 12, 13, 14, 15, 16], [17, 18, 19, 20, 21, 22, 23, 24], [25, 26, 27, 28, 29, 30, 31, 32], [33, 34, 35, 36, 37, 38, 39, 40], [41, 42, 43, 44, 45,

我有一个列表(8x8),如下所示:

array([[ 1,  2,  3,  4,  5,  6,  7,  8],
       [ 9, 10, 11, 12, 13, 14, 15, 16],
       [17, 18, 19, 20, 21, 22, 23, 24],
       [25, 26, 27, 28, 29, 30, 31, 32],
       [33, 34, 35, 36, 37, 38, 39, 40],
       [41, 42, 43, 44, 45, 46, 47, 48],
       [49, 50, 51, 52, 53, 54, 55, 56],
       [57, 58, 59, 60, 61, 62, 63, 64]])
我想将黑色指定给偶数,将白色指定给奇数(棋盘样式),并在每个单元格中显示值元素

到目前为止,我所掌握的代码是:

mtx = np.arange(1,65).reshape(8,8)
colors = 'white black'.split()
cmap = matplotlib.colors.ListedColormap(colors, name='colors', N=None)
mtx = np.arange(1,65).reshape(8,8)
plt.imshow(mtx, cmap=cmap)
plt.show()
只要做:

# even -> 0, odd -> 1
mtx = np.arange(1,65).reshape(8,8) % 2
plt.imshow(mtx, cmap='gray')
但这不会给你带来一个棋盘。相反,你会得到:

如果您想要棋盘样式,可以执行以下操作:

rows = np.arange(8) % 2

mtx = rows ^ rows[:,None]
plt.imshow(mtx, cmap='gray')
以及:


这是另一种将真/假值以棋盘方式分配给单元格索引的奇特方法:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap

arr = np.arange(1,65).reshape(8,8)
x, y = np.indices(arr.shape)
black_cell_idx = (x+y)%2
cmap = ListedColormap(['w','k'])
plt.imshow(black_cell_idx, cmap=cmap)

#Since it was asked in comments how to display cell values:
for i in range(arr.shape[0]):
    for j in range(arr.shape[1]):
        text = plt.text(j, i, arr[i, j],
                       ha="center", va="center", color="g")

plt.show()

这里
np.index
的主要优点是它可以扩展到3D(实际上是任何ND)空间。它允许引用任何数组的所有索引,无论其形状如何,如下所示:

>>> arr = np.arange(24).reshape(2,3,4)
>>> coords = np.array(list(np.broadcast(*np.indices(arr.shape))))
>>> coords 
array([[0, 0, 0],
       [0, 0, 1],
       ...
       [1, 2, 1],
       [1, 2, 2],
       [1, 2, 3]])
您还可以通过以下方式访问白细胞坐标:

    coords[np.sum(coords, axis=1) % 2 == 0]
这些见解被用作项目的一部分(免责声明:我是其作者)。你可以
git+clonehttps://github.com/loijord/numpyviz
然后像这样画一个3D棋盘:

import numpy as np
import matplotlib.pyplot as plt
from numpyviz import VisualArray

arr = np.arange(90).reshape((6,3,5))
va = VisualArray(arr)
cells = va.get_indices_chequerwise(window=(1,1,1))
va.set_colors(cells.T, color='yellow', basecolor='aqua')
va.vizualize(fixview=True)
plt.show()

另一个例子:

arr = np.arange(64).reshape((1,8,8))
va = VisualArray(arr)
cells = va.get_indices_chequerwise(window=(1,1,1))
va.set_colors(cells.T, color='white', basecolor='grey')
va.vizualize(fixview=True, axis_labels=(None,None,None))
va.ax.dist=12.5 #zoom out a little
plt.show()

谢谢!但我想保留原始值。您知道如何在同一彩色图像中显示单元格值吗?再次感谢@米盖吉斯:这似乎是个新问题,但请检查这个