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

如何快速绘制含np.nan的大矩阵:pyqtgraph与numpy实现

解决方案

一、用Numpy快速转换为[[x,y],...]格式数组

假设你的掩码处理后矩阵为data(numpy数组类型),可以通过numpy的向量化操作快速生成所需坐标数组,全程无循环,效率极高:

import numpy as np

# 1. 生成x轴数据:行索引,每个行索引重复对应行中非NaN元素的个数
x = np.repeat(np.arange(data.shape[0]), np.sum(~np.isnan(data), axis=1))
# 2. 提取所有非NaN的矩阵值作为y轴数据
y = data[~np.isnan(data)]
# 3. 组合成目标格式的数组
points_array = np.column_stack((x, y))

points_array就是你需要的[[x1,y1],[x2,y2],...]形式数组,其中x对应矩阵的行索引(第一维度),y对应矩阵中的有效数值。

二、直接用pyqtgraph.ScatterPlotItem绘制矩阵

不需要提前转换为二维数组,直接基于numpy生成x、y数组后传入ScatterPlotItem即可,适合大型矩阵的高效绘制:

import pyqtgraph as pg
from PyQt5.QtWidgets import QApplication
import numpy as np

# 初始化PyQt应用和绘图窗口
app = QApplication([])
win = pg.GraphicsLayoutWidget()
plot = win.addPlot(title="Masked Matrix Scatter Plot")

# 生成x、y数据(和上面转换数组的逻辑一致)
x = np.repeat(np.arange(data.shape[0]), np.sum(~np.isnan(data), axis=1))
y = data[~np.isnan(data)]

# 创建散点图项并添加到绘图区
scatter_item = pg.ScatterPlotItem(
    x=x, 
    y=y, 
    size=8,  # 点的大小
    pen=pg.mkPen(None),  # 去掉点的边框
    brush=pg.mkBrush(0, 180, 255)  # 设置点的填充颜色
)
plot.addItem(scatter_item)

# 显示窗口并启动应用
win.show()
app.exec_()

补充说明

  • 如果你的x轴对应矩阵的列索引(第二维度),只需要修改x的生成逻辑:
    x = np.tile(np.arange(data.shape[1]), data.shape[0])[~np.isnan(data).ravel()]
    
    同时y轴改为行索引:
    y = np.repeat(np.arange(data.shape[0]), data.shape[1])[~np.isnan(data).ravel()]
    
  • 上述方法均基于numpy向量化运算,处理大型矩阵时性能远优于循环遍历。

内容的提问来源于stack exchange,提问作者Andrei M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:17:37