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

如何正确重塑sklearn NMF输出W矩阵以绘制分量图像

问题原因

图像异常平铺是数组轴顺序匹配错误导致的:

  • 原始图像栈维度为(z, y, x) = (46, 974, 1414),NMF输入要求每一行对应同一个空间像素点(固定y,x)的全部z层值,形状为(y*x, z),且行顺序要和(y,x)空间网格的遍历顺序一一对应。
  • 直接对(z,y,x)顺序的数组执行data.reshape(-1, z)时,numpy按行优先规则展平,得到的每行是跨z、跨y的零散像素拼接,根本不是单空间点的z序列,后续把W直接reshape成(y,x,n_components)自然会出现像素错位、重复平铺的问题。
修正步骤

按正确的轴顺序做预处理和结果重塑即可,NMF拟合逻辑不需要改动:

  1. 先调整原始数组轴顺序,把z轴移到最后,让空间维度y、x排在前面:
import numpy as np
from sklearn import decomposition
import matplotlib.pyplot as plt

# 原始data形状(z,y,x) -> 调整为(y,x,z)
data_axisfix = np.moveaxis(data, source=0, destination=-1)
# 调整后形状为(974, 1414, 46)
  1. 展平为NMF要求的输入格式:
z, y, x = data.shape
data_r = data_axisfix.reshape(-1, z)
# 展平后形状为(974*1414=1377236, 46),每一行严格对应一个(y,x)位置的全z层值
  1. 执行原有NMF拟合代码:
estimator = decomposition.NMF(n_components = n_components, init = 'random')    
W = estimator.fit_transform(data_r)
H = estimator.components_
  1. 把W矩阵重塑回空间网格,绘制分量图:
# W形状为(总像素数, n_components),直接按(y,x,n_components)重塑即可
component_maps = W.reshape(y, x, n_components)
# 绘制第0个分量,若图像上下颠倒可加origin='lower'参数
plt.imshow(component_maps[:, :, 0])
plt.axis('off')
plt.show()
注意事项

不要图省事跳过轴调整步骤、直接在reshape W时改参数,这种方式很容易留下维度匹配隐患,后续绘制其他分量、或者做H矩阵的组分光谱分析时还会出问题。

内容的提问来源于stack exchange,提问作者operandos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 06:15:44