Меня интересует использование множества массивов несколько неоднородных типов данных. Поскольку numpy указывает, что данные должны быть однородными, это может быть достигнуто путем определения супер-dtype, который действует как оболочка объединения для всех подтипов. Затем доступ к полям подтипов дает другую интерпретацию базовых данных.

Для этого уже есть кое-что, например

dtype(('|S2', [('x', '|i1'), ('y', '|i1')]))

Относится к массиву двухбайтовых строк, но первый и второй байты также могут интерпретироваться как целые числа через имена полей «x» и «y». Однако я не могу понять, как присвоить метку поля двухбайтовой строке.

Можно ли сделать это более общим, чтобы мы могли накладывать на данные любое количество различных спецификаций полей?

Моя первая попытка заключалась в том, чтобы указать смещения полей в dtype, но это не удалось из-за жалобы на то, что смещения должны быть упорядочены (т.е. неперекрывающиеся данные).

dtype1 = np.dtype(dict(
   names=['a','b'], 
   formats=['|a2','<i2'], 
   offsets=[0,0]))

Другой способ работает, но он громоздкий. В этом методе я могу определить несколько переменных как представление для одних и тех же базовых данных и изменить dtype разных переменных, чтобы позволить мне получить доступ к данным в разных форматах, т.е.

a=np.zeros(3, dtype='<a2')
b=a[:]
b.dtype='<i2'

Это позволяет мне получать доступ к данным в виде строк или целых чисел в зависимости от того, смотрю я на a или b. Но это громоздкий способ манипулировать данными. В идеале я хотел бы иметь возможность указывать множество разных полей с произвольными смещениями. Есть какой-либо способ сделать это?

8
russt 14 Янв 2013 в 13:45

1 ответ

Лучший ответ

Типы объединения разрешены с июня 2011 г .: https://github.com/numpy/numpy/pull/ 94

Вам нужно будет перейти на NumPy 1.7.x, чтобы использовать это.

Однако в предыдущих версиях вы можете использовать конструктор оверлея dtype:

>>> a = np.zeros(3, dtype=np.dtype(('<i2', [('a', '|a2')])))
>>> a[0] = 0x3456
>>> a['a'][0]
'V4'

Это задокументировано на странице http. : //docs.scipy.org/doc/numpy-dev/reference/arrays.dtypes.html#specifying-and-constructing-data-types (найдите (base_dtype, new_dtype)).

5
ecatmur 14 Янв 2013 в 18:58