【问题标题】:Optimizing non regularized data reading to image优化非正则化数据读取到图像
【发布时间】: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


    【解决方案1】:

    我认为你的代码甚至没有做你想做的事,我运行它并在图像中只得到 14 个有效点。

    您可以使用pivot()unstack() 然后reindex() 创建图像。这是你想要的吗?

    data=io.StringIO(csv)
    df = pd.read_csv(data, sep=',', skip_blank_lines=True, quoting=2,
                     skipinitialspace=True, usecols = columns)
    img = df.pivot(index='Y', columns='X', values='V')
    img = img.reindex(index=range(df['Y'].min(), df['Y'].max() + 1),
                      columns=range(df['X'].min(), df['X'].max() + 1))
    
    extent = [df['X'].min() - 0.5, df['X'].max() + 0.5,
              df['Y'].min() - 0.5, df['Y'].max() + 0.5]
    plt.imshow(img, origin='lower', extent=extent)
    plt.colorbar()
    

    【讨论】:

    • 是的。正是这样。我将阅读有关枢轴、取消堆叠和重新索引的信息。我将尝试理解为什么我的代码没有达到我的预期。为什么 imshow 显示那些“模糊”点而不是尖点? (即使使用插值=None。
    • 你想要interpolation='none'。这在 matplotlib API 中很常见:'none' 表示什么都没有,None 表示一些默认值。注意文档字符串。
    • 我想我使用的是旧的 matplotlib 版本,因为 interpolation='none',给我一个 ValueError: Illegal interpolation string In [42]: matplotlib.__version__ Out[42]: '0.99.3 '
    • @Lin 非常非常老,我劝你升级。
    猜你喜欢
    • 2012-12-17
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多