У меня есть двоичный файл, который содержит чередующиеся данные; Вот скрипт 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
), так что он более поддается такому разделению на канал?