принудительное создание массива 1d numpy из списка / массива возможных итерируемых объектов - PullRequest
1 голос
/ 30 марта 2020

Я пытаюсь увидеть, есть ли более симпатичный способ создания (то есть принудительного создания) массива 1d numpy из другого списка / массива объектов. Эти объекты, однако, могут иметь записи, которые сами по себе являются итеративными (поэтому они могут быть списками, кортежами и т. Д. c., Но также могут быть более произвольными объектами).

Итак, чтобы сделать вещи действительно простыми, позвольте мне рассмотреть следующий сценарий:

a=[(1,2), (3,4), (3,5)]
b=np.array(a, dtype=object)
b.shape # gives (2,3), but I would like to have (3,1) or (3,)

Мне было интересно, есть ли хороший питонический / numpy 'i sh способ заставить b иметь форму (3,) и итеративную структуру элементов a, которой нужно пренебречь в b. Прямо сейчас я делаю это:

a=[(1,2), (3,4), (3,5)]
b=np.empty(len(a), dtype=object)
for i,x in enumerate(a):
    b[i]=x
b.shape # gives (3,) this is what i want. 

, который работает, но немного уродливо. Я не мог найти более хороший способ сделать это более встроенным в numpy. Любые идеи?

(больше контекста: что мне действительно нужно, это переставить измерения b различными способами, поэтому я не хочу, чтобы b что-либо знал о размерах его элементов, если они повторяемы). Спасибо!

1 Ответ

1 голос
/ 31 марта 2020
In [60]: b = np.empty(3, object)         

Вам не нужно повторять при назначении из списка:

In [61]: b[:] = [(1,2),(3,4),(3,5)]                                                            
In [62]: b                                                                                     
Out[62]: array([(1, 2), (3, 4), (3, 5)], dtype=object)
In [63]: b.shape                                                                               
Out[63]: (3,)

Для массива это не работает:

In [64]: b[:] = np.array([(1,2),(3,4),(3,5)])                                                  
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-64-3042dce1f885> in <module>
----> 1 b[:] = np.array([(1,2),(3,4),(3,5)])

ValueError: could not broadcast input array from shape (3,2) into shape (3)

Возможно, вы используете итерация в случае массива:

In [66]: for i,n in  enumerate(np.array([(1,2),(3,4),(3,5)])): 
    ...:     b[i] = n 
    ...:                                                                                       
In [67]: b                                                                                     
Out[67]: array([array([1, 2]), array([3, 4]), array([3, 5])], dtype=object)

Имейте в виду, что массивы dtype объекта являются немного резервным вариантом. np.array(...) пытается создать многомерный массив, если это возможно (с цифрой c dtype). Создание объекта dtype выполняется только в том случае, если это невозможно. А для некоторых комбинаций фигур он поднимает руки и выдает ошибку.

Превращение этого массива в список массивов с list() также работает (с той же скоростью):

In [92]: b[:] = list(np.array([(1,2),(3,4),(3,5)]))                                            
In [93]: b                                                                                     
Out[93]: array([array([1, 2]), array([3, 4]), array([3, 5])], dtype=object)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...