Создайте массив Numpy с произвольной формой (предпочтительно без циклов for) - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь отобразить топологию моей нейронной сети, используя numpy.

Я ищу способ создания массива неправильной формы, предпочтительно без использования циклов for.

Приведенный ниже код создает простой массив объектов. массив имеет неправильную форму и будет меняться в зависимости от переданной переменной «Iarray».

Топология моей нейронной сети - [2,3,2], поэтому эта функция выводит массив с тремя столбцами, 2 элемента в первом, 3 элемента во втором и 2 элемента в третьем.

 def object_array(Iarray):
     Array = np.empty([1,len(Iarray)],"object")
     Cell_Chain = np.empty()
     for i in range(len(Iarray)):   
         row = np.array([LSTM.Cell(i,ii) for ii in range(Iarray[i])])    
         Array[0,i] = row
     return Array 

Это выглядит неуклюже, и я бы очень хотел найти лучший способ написания этого кода.

Если у кого-нибудь есть идеи, я буду рад их услышать.

1 Ответ

1 голос
/ 10 июня 2019

Создать объектный массив dtype легко:

In [550]: arr = np.empty(5, object)                                                                    
In [551]: arr                                                                                          
Out[551]: array([None, None, None, None, None], dtype=object)

Вы можете заполнить его из списка объектов:

In [552]: arr[:] = [np.arange(i) for i in range(5)]                                                    
In [553]: arr                                                                                          
Out[553]: 
array([array([], dtype=int64), array([0]), array([0, 1]),
       array([0, 1, 2]), array([0, 1, 2, 3])], dtype=object)

фактически вы можете создать массив прямо из списка:

In [554]: np.array([np.arange(i) for i in range(5)])                                                   
Out[554]: 
array([array([], dtype=int64), array([0]), array([0, 1]),
       array([0, 1, 2]), array([0, 1, 2, 3])], dtype=object)

In [555]: np.array([np.arange(3) for i in range(5)])                                                   
Out[555]: 
array([[0, 1, 2],
       [0, 1, 2],
       [0, 1, 2],
       [0, 1, 2],
       [0, 1, 2]])

Назначение предопределенного массива более надежно:

In [561]: arr[:]=[np.arange(3) for i in range(5)]                                                      
In [562]: arr                                                                                          
Out[562]: 
array([array([0, 1, 2]), array([0, 1, 2]), array([0, 1, 2]),
       array([0, 1, 2]), array([0, 1, 2])], dtype=object)

Иногда в таком назначении могут возникать ошибки трансляции.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...