Как изменить тип dndarray на custom в numpy? - PullRequest
4 голосов
/ 04 октября 2011

Я сделал dtype:

mytype = np.dtype([('a',np.uint8), ('b',np.uint8), ('c',np.uint8)])

, поэтому массив, использующий этот тип:

test1 = np.zeros(3, dtype=mytype)

test1:

array([(0, 0, 0), (0, 0, 0), (0, 0, 0)],
      dtype=[('a', '|u1'), ('b', '|u1'), ('c', '|u1')])

Теперь у меня естьtest2:

test2 = np.array([[1,2,3], [4,5,6], [7,8,9]])

Когда я использую test2.astype(mytype), результат не тот, каким я хочу быть:

array([[(1, 1, 1), (2, 2, 2), (3, 3, 3)],
       [(4, 4, 4), (5, 5, 5), (6, 6, 6)],
       [(7, 7, 7), (8, 8, 8), (9, 9, 9)]],
      dtype=[('a', '|u1'), ('b', '|u1'), ('c', '|u1')])

Я хочу, чтобы результат был:

array([(1, 2, 3), (4, 5, 6), (7, 8, 9)],
      dtype=[('a', '|u1'), ('b', '|u1'), ('c', '|u1')])

Есть ли способ?Благодаря.

Ответы [ 2 ]

5 голосов
/ 04 октября 2011

Вы можете использовать fromarrays метод numpy.core.records (см. документация ):

np.rec.fromarrays(test2.T, mytype)
Out[13]: 
rec.array([(1, 2, 3), (4, 5, 6), (7, 8, 9)], 
      dtype=[('a', '|u1'), ('b', '|u1'), ('c', '|u1')])

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

0 голосов
/ 14 июля 2017

Поскольку все поля имеют одинаковый тип, вы также можете использовать:

>>> test2.astype(np.uint8).view(mytype).squeeze(axis=-1)
array([(1, 2, 3), (4, 5, 6), (7, 8, 9)], 
      dtype=[('a', 'u1'), ('b', 'u1'), ('c', 'u1')])

Требуется сжатие, потому что test2 - это 2d, но вы хотели получить 1d

...