如何快速绘制含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的生成逻辑:
同时y轴改为行索引:x = np.tile(np.arange(data.shape[1]), data.shape[0])[~np.isnan(data).ravel()]y = np.repeat(np.arange(data.shape[0]), data.shape[1])[~np.isnan(data).ravel()] - 上述方法均基于numpy向量化运算,处理大型矩阵时性能远优于循环遍历。
内容的提问来源于stack exchange,提问作者Andrei M.
相关产品推荐
相关产品推荐

