Python中按值嵌套的列表理解样式(国际象棋样式)
我有一个列表(8x8),如下所示: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,
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()
谢谢!但我想保留原始值。您知道如何在同一彩色图像中显示单元格值吗?再次感谢@米盖吉斯:这似乎是个新问题,但请检查这个