Правильная форма ввода данных для структурированного массива - это список кортежей:
In [71]: signal = [(1,2,3),(2,3,1),(3,2,1)]
...: col_names = ('left','right','center')
...: signal = np.array(signal, dtype = [(n, 'int16') for n in col_names])
In [72]:
In [72]: signal
Out[72]:
array([(1, 2, 3), (2, 3, 1), (3, 2, 1)],
dtype=[('left', '<i2'), ('right', '<i2'), ('center', '<i2')])
1.16
добавил пару функций, которые облегчают преобразование в структурированные массивы и из них:
In [73]: import numpy.lib.recfunctions as rfn
In [74]: signal = np.array([[1,2,3],[1,2,3],[1,2,3]])
In [75]: dt = np.dtype([(n, 'int16') for n in col_names])
In [76]: dt
Out[76]: dtype([('left', '<i2'), ('right', '<i2'), ('center', '<i2')])
In [77]: rfn.unstructured_to_structured(signal, dt)
Out[77]:
array([(1, 2, 3), (1, 2, 3), (1, 2, 3)],
dtype=[('left', '<i2'), ('right', '<i2'), ('center', '<i2')])
Применение этого dt
к signal
имеет проблему:
In [82]: signal.view(dt)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-82-f0fa01ce8128> in <module>
----> 1 signal.view(dt)
ValueError: When changing to a smaller dtype, its size must be a divisor of the size of original dtype
Мы можем обойти это, сначала преобразовав signal
в совместимый тип d:
In [83]: signal.astype('i2').view(dt)
Out[83]:
array([[(1, 2, 3)],
[(1, 2, 3)],
[(1, 2, 3)]],
dtype=[('left', '<i2'), ('right', '<i2'), ('center', '<i2')])
Но обратите внимание, что Out[83]
форма (3,1).Другие массивы были формы (3,).view
всегда имел эту проблему формы при преобразовании в / из структурированных массивов.Это одна из причин, почему новые функции проще в использовании.