NumPy - расщепление массива по известным размерам - PullRequest
2 голосов
/ 27 февраля 2020

Мне нужно взять массив и разбить его по столбцам по известным значениям ширины.

Скажем, у меня есть массив:

>>> arr
array([[b'13456789'],
       [b'45678912']], dtype='|S8')

Мне нужно преобразовать его по значениям ширины, известным ранее:

>>> arr
array([[b'13', b'456', b'7', b'89'],
       [b'45', b'678', b'9', b'12']], 
       dtype=[('a', '|S2'), ('b', '|S3'), ('c', '|S1'), ('d', '|S2')])

Использование numpy.genfromtxt может показаться идеальным, но я читаю из двоичного файла, кодировка данных которого представлена ​​в виде строк после 160-байтового заголовка, другие данные, которые не кодируются как строки, поэтому я использую struct.unpack для них. Однако numpy.genfromtxt не поддерживает двоичные файлы или имеет параметр смещения; но у него есть параметр delimiter, который полезен.

1 Ответ

3 голосов
/ 27 февраля 2020

Зная заранее желаемую ширину байтов, вы можете взять view массива с желаемой структурой как:

arr = np.array([[b'13456789'],
                [b'45678912']], dtype='|S8')

arr.view('S2,S3,S1,S2')

array([[(b'13', b'456', b'7', b'89')],
       [(b'45', b'678', b'9', b'12')]],
      dtype=[('f0', 'S2'), ('f1', 'S3'), ('f2', 'S1'), ('f3', 'S2')])

Yo просто нужно сделать убедитесь, что общий размер в байтах последней оси массива с новым dtype является делителем исходного размера. Это означает, что вы также можете сделать что-то вроде:

arr.view('S2,S2')
array([[(b'13', b'45'), (b'67', b'89')],
       [(b'45', b'67'), (b'89', b'12')]],
      dtype=[('f0', 'S2'), ('f1', 'S2')])

То же самое относится к массиву строк Юникода фиксированного размера, например:

a = np.array([['peach'],
              ['apple']], dtype='U5')

a.view('U1')
array([['p', 'e', 'a', 'c', 'h'],
       ['a', 'p', 'p', 'l', 'e']], dtype='<U1')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...