Считает ли NumPy одномерные фрагменты массивов странным образом? - PullRequest
0 голосов
/ 22 сентября 2019
import numpy as np
a = np.array([[(1, 2, 3), 40, 50], [(4, 5, 6), 70, 80]])

Использование только пустых операций (то есть без явного создания списка или циклов в стиле Python; цель - сэкономить время, если это возможно), как мне создать массив пустышек 2 на 3 (матрица) [[1,2,3], [4,5,6]] из вышеуказанного массива a?

Срез a [:, 0] создает одномерный массив формы (2,), который печатается как [(1,2,3) (4,5,6)], что явно не может быть«Изменить» d к форме (2, 3).Я думал, что выполнение np.ravel для [:, 0] с последующим изменением формы на (2,3) может решить эту проблему для меня, но, к сожалению, np.ravel для [:, 0] не даст никаких изменений, потому что [:, 0] уже 1-D.

Это известная аберрация / ошибка в numpy, что numpy не обрабатывает скобки кортежей (1, 2, 3) и (4, 5, 6) в срезе, таком как [:,0] как показательные строки?Потому что, как мы знаем, np.array ([(1, 2, 3), (4, 5, 6)]) создает двумерный массив формы (2,3).

Ответы [ 2 ]

1 голос
/ 22 сентября 2019
In [30]: a = np.array([[(1, 2, 3), 40, 50], [(4, 5, 6), 70, 80]])               

Посмотрите на a:

In [31]: a                                                                      
Out[31]: 
array([[(1, 2, 3), 40, 50],
       [(4, 5, 6), 70, 80]], dtype=object)
In [32]: a.shape                                                                
Out[32]: (2, 3)

1-й столбец - 2 элемента, оба кортежа

In [33]: a[:,0]                                                                 
Out[33]: array([(1, 2, 3), (4, 5, 6)], dtype=object)

они могут быть объединены в один 2d массив с помощью:

In [34]: np.stack(_)                                                            
Out[34]: 
array([[1, 2, 3],
       [4, 5, 6]])

Структура этих двух последних массивов совершенно различна.У одного есть 2 элемента, ссылки на кортежи еще где-то в памяти.Другой имеет 6 элементов, чисел, а не ссылок, с двумерной формой и шагами.

Это отличается:

In [35]: np.array([(1, 2, 3), (4, 5, 6)])                                       
Out[35]: 
array([[1, 2, 3],
       [4, 5, 6]])

Он создает массив из списка кортежей.Out[33] создает массив из существующего массива (с объектом dtype).

0 голосов
/ 22 сентября 2019

Если все строки имеют одинаковую структуру, вы можете получить поведение, близкое к желаемому:

a = np.array([((1, 2, 3), 40, 50), ((4, 5, 6), 70, 80)], dtype=("(3,)i,i,i"))

Обратите внимание, что вам нужно установить составной d-тип, указывающий структуру строк, и что вы должны использоватькортежи для строк в инициализаторе.Результирующий массив выглядит как

a
# array([([1, 2, 3], 40, 50), ([4, 5, 6], 70, 80)],
#       dtype=[('f0', '<i4', (3,)), ('f1', '<i4'), ('f2', '<i4')])

Вы можете получить доступ к интересующему биту по имени поля

a['f0']
# array([[1, 2, 3],
#        [4, 5, 6]], dtype=int32)

a['f0'].shape
# (2, 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...