使用 numpy 将 csv 加载到二维矩阵中以进行绘图

Posted

技术标签:

【中文标题】使用 numpy 将 csv 加载到二维矩阵中以进行绘图【英文标题】:load csv into 2D matrix with numpy for plotting 【发布时间】:2011-05-17 23:04:48 【问题描述】:

鉴于此 CSV 文件:

"A","B","C","D","E","F","timestamp"
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291111964948E12
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291113113366E12
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291120650486E12

我只是想将它加载为具有 3 行和 7 列的矩阵/ndarray。但是,出于某种原因,我能从 numpy 中得到的只是一个 3 行(每行一个)且没有列的 ndarray。

r = np.genfromtxt(fname,delimiter=',',dtype=None, names=True)
print r
print r.shape

[ (611.88243, 9089.5601000000006, 5133.0, 864.07514000000003, 1715.3747599999999, 765.22776999999996, 1291111964948.0)
 (611.88243, 9089.5601000000006, 5133.0, 864.07514000000003, 1715.3747599999999, 765.22776999999996, 1291113113366.0)
 (611.88243, 9089.5601000000006, 5133.0, 864.07514000000003, 1715.3747599999999, 765.22776999999996, 1291120650486.0)]
(3,)

我可以手动迭代并将其修改成我想要的形状,但这似乎很愚蠢。我只想将它加载为一个合适的矩阵,这样我就可以在不同的维度上对其进行切片并绘制它,就像在 matlab 中一样。

【问题讨论】:

【参考方案1】:

纯 numpy

numpy.loadtxt(open("test.csv", "rb"), delimiter=",", skiprows=1)

查看loadtxt 文档。

你也可以使用 python 的 csv 模块:

import csv
import numpy
reader = csv.reader(open("test.csv", "rb"), delimiter=",")
x = list(reader)
result = numpy.array(x).astype("float")

您必须将其转换为您喜欢的数字类型。我想你可以在一行中写下整个内容:

结果 = numpy.array(list(csv.reader(open("test.csv", "rb"), delimiter=","))).astype("float")

添加提示:

您也可以使用pandas.io.parsers.read_csv 并获取关联的numpy 数组,这样可以更快。

【讨论】:

我要补充一点,skirows=1 标志正在跳过第一行,如果您想保留所有数据,它不是标准的激活标志。完美运行! loadtxt 也不会加载在 genfromtxt 上出现 names=True 的列名 我能问一下 - open 是该单行的本地吗?如,文件是否在行尾关闭? 是的,它会关闭文件。另见:***.com/questions/8011797/… @fireball.1 对这样的声明进行速度测试对后代来说非常有用【参考方案2】:

我认为在有名称行的地方使用dtype 会混淆例程。试试

>>> r = np.genfromtxt(fname, delimiter=',', names=True)
>>> r
array([[  6.11882430e+02,   9.08956010e+03,   5.13300000e+03,
          8.64075140e+02,   1.71537476e+03,   7.65227770e+02,
          1.29111196e+12],
       [  6.11882430e+02,   9.08956010e+03,   5.13300000e+03,
          8.64075140e+02,   1.71537476e+03,   7.65227770e+02,
          1.29111311e+12],
       [  6.11882430e+02,   9.08956010e+03,   5.13300000e+03,
          8.64075140e+02,   1.71537476e+03,   7.65227770e+02,
          1.29112065e+12]])
>>> r[:,0]    # Slice 0'th column
array([ 611.88243,  611.88243,  611.88243])

【讨论】:

有趣的是,这并没有改变我的结果。我正在使用 Python 2.5 和 numpy 1.4.1 所以也许这就是问题 我正在使用 Python 2.6 和 NumPy 1.3.0!我更喜欢旧的行为。【参考方案3】:

您可以使用np.genfromtxt 将带有标题的CSV 文件读入NumPy structured array。例如:

import numpy as np

csv_fname = 'file.csv'
with open(csv_fname, 'w') as fp:
    fp.write("""\
"A","B","C","D","E","F","timestamp"
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291111964948E12
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291113113366E12
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291120650486E12
""")

# Read the CSV file into a Numpy record array
r = np.genfromtxt(csv_fname, delimiter=',', names=True, case_sensitive=True)
print(repr(r))

看起来像这样:

array([(611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777, 1.29111196e+12),
       (611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777, 1.29111311e+12),
       (611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777, 1.29112065e+12)],
      dtype=[('A', '<f8'), ('B', '<f8'), ('C', '<f8'), ('D', '<f8'), ('E', '<f8'), ('F', '<f8'), ('timestamp', '<f8')])

您可以像这样访问命名列r['E']

array([1715.37476, 1715.37476, 1715.37476])

注意:此答案之前使用np.recfromcsv 将数据读入NumPy record array。虽然该方法没有任何问题,但结构化数组在速度和兼容性方面通常优于记录数组。

【讨论】:

以上是关于使用 numpy 将 csv 加载到二维矩阵中以进行绘图的主要内容,如果未能解决你的问题,请参考以下文章

如何将csv文件转换为numpy数组格式?

将 CSV 文件加载到 NumPy memmap 数组使用太多内存

如何将 CSV 文件中的数据加载到 numpy 数组中[重复]

将稀疏 scipy 矩阵加载到现有的 numpy 密集矩阵中

NumPy数据存取与函数

如何将 Argb32 加载到特征矩阵中以获得最佳性能?