【问题标题】:NumPy mmap: "ValueError: Size of available data is not a multiple of data-type size."NumPy mmap:“ValueError:可用数据的大小不是数据类型大小的倍数。”
【发布时间】:2013-03-08 20:53:20
【问题描述】:

我正在尝试将数据从“data.txt”获取到一个 numpy 数组中,并用 matplotlib 绘制它。这是每行数据的样子:

“1”11.658870417634 4.8159509459201

大约有一千万行。

我正在尝试将其放入内存映射,但不断收到此错误:

ValueError: Size of available data is not a multiple of data-type size.

这是我正在使用的代码:

import numpy
import matplotlib

matplotlib.use('Agg')
import matplotlib.pyplot as plt

datatype=[('index',numpy.int), ('floati',numpy.float32), ('floatq',numpy.float32)]
filename='data.txt'

def main():
    data = numpy.memmap(filename, datatype, 'r') 
    plt.plot(data['floati'],data['floatq'],'r,')
    plt.grid(True)
    plt.title("Signal-Diagram")
    plt.xlabel("Sample")
    plt.ylabel("In-Phase")
    plt.savefig('foo2.png')

if __name__ == "__main__":
    main()  

如果您能帮我找出哪里出错了,我将不胜感激。

【问题讨论】:

  • @nneonneo 在下面的答案中指出了您的代码的问题。您可能还想查看Pandas 库;特别是IO Tools.

标签: python numpy mmap


【解决方案1】:

这是一个文本文件,而不是二进制文件。 memmap 仅在数据以二进制形式存储时才有效(即以数组形式存储在内存中)。

您可以通过逐行读取文件并将每个转换后的行存储在可写的memmap 中来将文件转换为二进制文件。

【讨论】:

  • 除了像genfromtxtloadtxt 那样只读取文本文件之外,首先转换为二进制有什么好处吗?
  • 如果您需要经常使用数据,最好以更快的格式保存。您只需要转换一次,之后您就可以使用memmap 运行程序。这会运行得快很多
  • 您的意思是当您首先保存文件时,而不是在您正在读取文件的情况下?因为当你阅读它的时候,你就是把它保存为一个 numpy 数组来使用,对吧?
  • 使用普通的genfromtxt/loadtxt 将数组读入内存,但不一定将数组保存在任何地方。然后当程序再次启动时,它必须再次读取整个数组,执行读取文本文件所需的所有解析。如果你做一次二进制文件,那么以后打开文件会很快。
  • 我明白了,谢谢。为此,我只使用了np.savenp.savez,这很简单,但可能更有限。
【解决方案2】:

您最好使用numpy.genfromtxtnumpy.loadtxt。例如:

datatype=[('index',numpy.int), ('floati',numpy.float32), ('floatq',numpy.float32)]
filename='data.txt'

def main():
    data = numpy.genfromtxt(filename, dtype=datatype) 
    ...

【讨论】:

  • +1 很好的建议。这可能是解决 OP 问题的最简单方法。
猜你喜欢
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 2016-12-10
相关资源
最近更新 更多