【发布时间】:2016-05-14 13:34:38
【问题描述】:
我有一些未正则化的源数据(示例显示在下面代码的 csv 变量中)。在此数据中,我无法保证任何最小值、最大值或步长值。因此,我需要找出源数据。
读取数据并定义绘制图像所需的值后,我使用下面的循环。像这样运行这段代码读取(150k 行)表明代码非常慢,我花了大约 110 秒(!!!)来渲染整个图像(一个非常小的图像)。
欢迎任何提示,即使我必须使用其他库或数据类型。我的主要目标是显示来自 csv 源的“热图”,例如可以跨越一百万行的那些。将文件读入数据集或绘制图形很快。问题是从 csv 创建图像映射。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import io
csv = """
"X","Y","V"
1001,1001,909.630432
1001,1003,940.660156
1001,1005,890.571594
1001,1007,999.651062
1001,1009,937.775513
1003,1002,937.601074
1003,1004,950.006897
1003,1006,963.458923
1003,1008,878.646851
1003,1012,956.835938
1005,1001,882.472656
1005,1003,857.491028
1005,1005,907.293335
1005,1007,877.087891
1005,1009,852.005554
1007,1002,880.791931
1007,1004,862.990967
1007,1006,882.135864
1007,1008,896.634521
1007,1010,888.916626
1013,1001,853.410583
1013,1003,863.324341
1013,1005,843.284607
1013,1007,852.712097
1013,1009,882.543640
"""
data=io.StringIO(csv)
columns = [ "X" , "Y", "V" ]
df = pd.read_csv(data, sep=',', skip_blank_lines=True, quoting=2, skipinitialspace=True, usecols = columns, index_col=[0,1] )
# Fields
x_axis="X"
y_axis="Y"
val="V"
# Unique values on the X-Y axis
x_ind=df.index.get_level_values(x_axis).unique()
y_ind=df.index.get_level_values(y_axis).unique()
# Size of each axis
nx = len(x_ind)
ny = len(y_ind)
# Maxima and minima
xmin = x_ind.min()
xmax = x_ind.max()
ymin = y_ind.min()
ymax = y_ind.max()
img = np.zeros((nx,ny))
print "Entering in loop"
for ix in range(0, nx):
print "Mapping {0} {1}".format( x_axis, ix )
for iy in range(0, ny):
try:
img[ix,iy] = df.loc[ix+xmin,iy+ymin][val]
except KeyError:
img[ix,iy] = np.NaN
plt.imshow(img, extent=[xmin, xmax, ymin, ymax], cmap=plt.cm.jet, interpolation=None)
plt.colorbar()
plt.show()
尝试使用 pcolormesh,但在不使用类似循环的情况下无法将值正确拟合到网格中。我无法在没有循环的情况下创建 z_mesh
x_mesh,y_mesh = np.mgrid[xmin:xmax,ymin:ymax]
z_mesh = ?? hints ?? ;-)
【问题讨论】:
标签: python csv optimization matplotlib imshow