numpy数组坐标转matplotlib坐标的困惑及技术咨询
NumPy数组坐标与Matplotlib坐标的转换解惑
核心问题在于NumPy数组索引规则和Matplotlib笛卡尔坐标系的逻辑差异:
- NumPy数组用
(row, col)索引,左上角是(0,0),行号向下递增(越往下行号越大),列号向右递增。 - Matplotlib用
(x, y)坐标,左下角是(0,0),x向右递增(对应数组列号),y向上递增(和数组行号方向完全相反)。
你的示例问题分析
你的代码里直接把w[0](NumPy的行索引)赋值给Matplotlib的x,w[1](NumPy的列索引)赋值给y,这既搞反了x/y对应的数组维度,也没处理y轴方向的差异:
- 示例中
activation_map是2行3列,argmin()找到的最小值在(0,2)位置(数组左上角起第1行第3列)。 - 你代码里用
w[0]=0当x,w[1]=2当y,画出来的点和数组里的实际位置完全不对应。
正确的转换方法
把NumPy的(row, col)转换为Matplotlib的(x, y)需要两步:
- x坐标直接对应数组的列号(
col),因为两者都是从左到右递增。 - y坐标需要用
总行数 - 1 - row,把NumPy向下递增的行号转换为Matplotlib向上递增的y轴坐标。
修改后的示例代码
import numpy as np import matplotlib.pyplot as plt activation_map = np.array([[1, 2, 0], [2, 3, 2]]) w = np.unravel_index(activation_map.argmin(), activation_map.shape) print(f"NumPy坐标(行,列): {w}") rows, cols = activation_map.shape # 转换为Matplotlib坐标 plt_x = w[1] plt_y = rows - 1 - w[0] plt.xticks(np.arange(0, cols, 1)) plt.yticks(np.arange(0, rows, 1)) # 标记正确的位置 plt.plot(plt_x, plt_y, 'x', markersize=12, markeredgewidth=2) # 可选:画出数组的每个值作为参考 for i in range(rows): for j in range(cols): plt.text(j, rows-1-i, activation_map[i,j], ha='center', va='center') plt.grid(True) plt.show()
这段代码会把最小值0对应的NumPy坐标(0,2),转换为Matplotlib的(2,1)(因为总行数是2,2-1-0=1),和数组里的位置完全对应。
MiniSom场景适配
在MiniSom中,winner()返回的(row, col)就是Som网格的行和列索引,和NumPy数组索引逻辑一致。所以标记神经元位置时,直接套用上面的转换规则即可:
- x = 神经元列索引
- y = Som的总行数 - 1 - 神经元行索引
内容的提问来源于stack exchange,提问作者stschn
相关产品推荐
相关产品推荐

