You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)需要两步:

  1. x坐标直接对应数组的列号(col),因为两者都是从左到右递增。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 09:20:59