如何绘制灰度色块?能否用二维数组替代三维数组实现?
用二维数组绘制50种灰度色块的简化实现
嘿,你的思路完全正确!灰度确实只需要单通道的数值就能表示——毕竟RGB三个分量相同的时候,本质就是一个单一的亮度值,根本没必要用三维数组来重复三次相同的数据。我来帮你把三维数组的实现改成更简洁的二维版本,完全满足你的需求~
核心逻辑梳理
RGB灰度的本质是:每个像素的R、G、B分量数值相同(或接近),所以我们只需要存储一个亮度值,matplotlib会自动把它转换成对应的灰度色彩。
二维数组实现代码
先补全你提到的三维数组实现示例(方便对比):
import matplotlib.pyplot as plt import numpy as np # 生成50个从接近黑到接近白的灰度值 gray_values = np.linspace(1, 254, 50, dtype=np.uint8) # 三维数组:50行色块 × 100列宽度 × 3通道 gray_blocks_3d = np.repeat(gray_values[:, np.newaxis, np.newaxis], 100, axis=1) gray_blocks_3d = np.repeat(gray_blocks_3d, 3, axis=2) fig, ax = plt.subplots(figsize=(10, 5)) ax.imshow(gray_blocks_3d) ax.axis('off') plt.show()
下面是简化后的二维数组版本:
import matplotlib.pyplot as plt import numpy as np # 同样生成50个灰度值,范围1到254 gray_values = np.linspace(1, 254, 50, dtype=np.uint8) # 二维数组:50行色块 × 100列宽度,每行的所有像素都是同一个灰度值 gray_blocks_2d = np.repeat(gray_values[:, np.newaxis], 100, axis=1) fig, ax = plt.subplots(figsize=(10, 5)) # 直接传入二维数组,指定cmap='gray'(其实默认就是灰度,写出来更清晰) ax.imshow(gray_blocks_2d, cmap='gray') ax.axis('off') plt.show()
为什么这个方案可行?
imshow函数处理二维数组时,默认会将数值映射到灰度色阶:数值0对应纯黑,255对应纯白,完美匹配你的灰度需求。- 省去了重复三次通道的步骤,数组内存占用直接降到原来的1/3,代码也更简洁易懂。
对了,完全get你说的“与那本书无关!;)”的点,咱们就专注在把代码简化到位😉
内容的提问来源于stack exchange,提问作者n1k31t4
相关产品推荐
相关产品推荐

