Разбивать чередующиеся данные на отдельные каналы 'np.arrays? - PullRequest
1 голос
/ 27 марта 2019

У меня есть двоичный файл, который содержит чередующиеся данные; Вот скрипт Python, который сгенерирует пример этого:

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

#!/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

... хранится в виде двоичных чисел.

По сути, я хочу получить данные отдельных каналов в виде отдельных массивов, где каналы будут:

  • 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.py и il3ch.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, я могу наложить какую-то структуру, которая находится в данных - однако, в качестве выходных данных я получаю np.array из (CH1, CH2, CH3) кортежей и я действительно не могу сказать, что мне нужно сделать, чтобы разделить этот массив np.array.

Итак, мой вопрос: как я могу разбить массив bin_np_arr np.array на три отдельных массива np.arrays, которые будут соответствовать данным отдельного канала? Кроме того, я должен читать в bin_np_arr иначе, чем в файле (например, поэтому он имеет .shape), так что он более поддается такому разделению на канал?

1 Ответ

1 голос
/ 27 марта 2019

При использовании структурированного массива вы можете получить доступ к массивам, соответствующим каждому полю, с синтаксисом ['<field name>']. В вашем случае вы можете просто сделать:

ch1, ch2, ch3 = bin_np_arr['CH1'], bin_np_arr['CH2'] and bin_np_arr['CH3']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...