将交错的数据拆分到单独的通道的np.arrays中?

时间:2019-03-27 09:55:49

标签: python arrays numpy

我有一个二进制文件,其中包含交织的数据;这是一个Python脚本,将生成一个示例:

test-np-array-il-split-01.py

#!/usr/bin/env python2
# (also works with python3)

# generate a test binary file with interleaved floats

thebinfilename = "il3ch.binfile"

import struct

# https://docs.python.org/2/library/struct.html :  "=" native; "<" little-endian; ">" big-endian
with open(thebinfilename, 'wb') as f:
  for ix in range(10):
    decremain = ix/100.0;
    for ic in range(3):
      thischannum = ic+1 + decremain;
      print(thischannum)
      f.write(struct.pack("=f", thischannum))

基本上,只需运行python test-np-array-il-split-01.py,您将在同一目录中获得一个二进制文件il3ch.binfile。该文件基本上具有以下浮动数字序列:

  

1.0、2.0、3.0、1.01、2.01、3.01、1.02、2.02、3.02、1.03、2.03、3.03、1.04、2.04、3.04、1.05、2.05、3.05、1.06、2.06、3.06、1.07、2.07、3.07 ,1.08、2.08、3.08、1.09、2.09、3.09

...存储为二进制浮点数。

基本上,我想将单个通道数据作为单独的numpy数组获得,其中通道将是:

  • Ch1:1.0、1.01、1.02、1.03、1.04,...
  • Ch2:2.0、2.01、2.02、2.03、2.04,...
  • Ch3:3.0、3.01、3.02、3.03、3.04,...

因此,我尝试编写以下脚本(将其与test-np-array-il-split-01.pyil3ch.binfile放在同一文件夹中)

test-np-array-il-split-02.py

#!/usr/bin/env python2
# (also works with python3)

# read a test binary file with interleaved floats

thebinfilename = "il3ch.binfile"

import numpy as np

dt = np.dtype( [ ('CH1', '<f4'), ('CH2', '<f4'), ('CH3', '<f4') ] )
bin_np_arr = np.fromfile(thebinfilename, dtype=dt)

print(bin_np_arr.shape) # (10,)
print(bin_np_arr)
# [(1.  , 2.  , 3.  ) (1.01, 2.01, 3.01) (1.02, 2.02, 3.02)
#  (1.03, 2.03, 3.03) (1.04, 2.04, 3.04) (1.05, 2.05, 3.05)
#  (1.06, 2.06, 3.06) (1.07, 2.07, 3.07) (1.08, 2.08, 3.08)
#  (1.09, 2.09, 3.09)]

ch1, ch2, ch3 = bin_np_arr[:][0], bin_np_arr[:][1], bin_np_arr[:][2]

print(ch1) # (1., 2., 3.) # -> however, I want 1.0, 1.01, 1.02, 1.03 ... etc here!

所以,好的事情是,通过使用np.dtype规范,我可以在数据中施加某种结构-但是,作为输出,我得到(CH1,CH2,CH3 )元组,而我真的无法告诉我要做什么来拆分此np.array。

所以我的问题是:如何将bin_np_arr np.array拆分为三个单独的np.array,分别对应于各个通道数据?另外,我应该从文件中读取bin_np_arr还是从文件中读取不同的内容(例如,它具有不同的.shape),以便它更适合这种“按通道”拆分吗?

1 个答案:

答案 0 :(得分:1)

使用structured array时,可以使用语法['<field name>']访问与每个字段相对应的数组。就您而言,您可以执行以下操作:

ch1, ch2, ch3 = bin_np_arr['CH1'], bin_np_arr['CH2'] and bin_np_arr['CH3']