Python" numpy.dtype"读取二进制到" list"的结构用" numpy.fromfile"

时间:2015-08-01 04:20:31

标签: python arrays numpy

+++警告,以下内容包含非常简单的编程+++

+++请帮助!!! +++

嘿,我正在玩我很长一段时间阅读惯例并且我还没有找到一个好的和快速的方法!

我有类似这样的东西:一个巨大的二进制文件,我想把它切成一个numpy-array!

我创建了这个结构,从文件读入一定数量的字节:

    mydt = numpy.dtype([
                       ('col1', np.uint64),
                       ('col2', np.int32),
                       ('cols3_56', np.float32, (53,))
                       ])

这样读:

data_block = numpy.fromfile(openfile, dtype=mydt, count=ntimes)

我得到的是这样的:

[(88000031189210L, 1, [-1000.0, -1000.0, -1000.0, -2.0, -2.0, -2.0, 65004000.0, 0.0, 760680000.0, 0.0, 0.12124349921941757, 0.04971266910433769, 2328.39990234375, 0.00013795999984722584, 0.0, 0.0, -1.0, -1.0, -1.0, 65004000.0, -1.0, 760680000.0, 0.0, 0.0, -1.0, 825680000.0, 0.0, -1.0, -1.0, -1.0, 157630.0, 0.0, 756310.0, 0.0, -1.0, -1.0, 0.0, 5.250500202178955, 0.0, 5.250500202178955, -13.602999687194824, -16.760000228881836, -17.283000946044922, -16.95800018310547, -17.513999938964844, -17.57200050354004, -13.657999992370605, -16.77199935913086, -17.291000366210938, -16.9689998626709, -17.520999908447266, -17.57200050354004, 1.0]), [(88......1L, 1, [-1000.0, ....]), ....

然后我将这个数据块扩展到我的数组

data_block_array.extend(data_block)

......这一百万次......

我现在想要访问两件事:

  • 上述结构中的第2个元素(在本例中为" 1") 整个数据阵列是上述的几百万倍 提到数组
  • 53列中的第8个(总共第12个)元素 整个阵列的数据块,再次是数百万个子结构!

我认为在计数上做了一些循环:

 i=0           
 while i<count:
     self.data_array[i,element1] = data_block_array[i][1]
     self.data_array[i,element8] = data_block_array[i][2][13]  

这是令人难以置信的慢......我想开发一种非常快速简便的方法来过滤我的数据并提取我感兴趣的列。欣赏一些建议和见解!

1 个答案:

答案 0 :(得分:1)

你可以尝试memmap:

import numpy as np
mydt = np.dtype([
                   ('col1', np.uint64),
                   ('col2', np.int32),
                   ('cols3_56', np.float32, (53,))
                   ])
data = np.zeros(1000, dtype=mydt)
tmp = data.view(np.float32)
tmp[:] = np.random.rand(len(tmp))
data.tofile("tmp.dat")
mm = np.memmap("tmp.dat", mydt, "r")
assert np.all(data["col2"] == np.asarray(mm["col2"]))
assert np.all(data["cols3_56"][7] == np.asarray(mm["cols3_56"][7]))
相关问题