переписать со списками: как ссылаться на первый элемент в списке - PullRequest
0 голосов
/ 01 ноября 2018

Я хочу скопировать содержимое нескольких полей в массиве записей в ndarray (оба типа float64). Я знаю, как это сделать, когда данные повторного массива имеют одно значение в каждом поле:

my_ndarray[:,0]=my_recarray['X']  #(for field 'X')

Теперь у меня есть повторный массив со списком из 5 чисел в каждом поле, и я хочу только скопировать первый элемент каждого списка. Когда я использую вышеупомянутое с новым recarray (и списком), я получаю эту ошибку:

ValueError: could not broadcast input array from shape (92,5) into shape (92)

Это имеет смысл (задним числом).

Я думал, что смогу получить только первый элемент каждого с этим:

my_ndarray[:,0]=my_recarray['X'][0]  #(for field 'X')

Я получаю эту ошибку:

ValueError: could not broadcast input array from shape (5) into shape (92)

Я понимаю, что ... numpy берет только первый ряд (5 элементов) и пытается транслировать в столбец из 92 элементов.

Итак ... теперь мне интересно, как получить первый элемент каждого списка в столбце 92 элементов, Почесать мне голову .... Заранее спасибо за совет.

1 Ответ

0 голосов
/ 01 ноября 2018

Я предполагаю, что recarray имеет dtype, где одно из полей имеет форму 5:

In [48]: dt = np.dtype([('X',int,5),('Y',float)])
In [49]: arr = np.zeros(3, dtype=dt)
In [50]: arr
Out[50]: 
array([([0, 0, 0, 0, 0], 0.), ([0, 0, 0, 0, 0], 0.),
       ([0, 0, 0, 0, 0], 0.)], dtype=[('X', '<i8', (5,)), ('Y', '<f8')])

Доступ к этому полю по имени дает массив (3,5) формы (аналог вашей (92,5):

In [51]: arr['X']
Out[51]: 
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])

Это можно описать как список из 5 элементов для каждой записи, но при индексировании по имени поля создается двумерный массив, который может индексироваться как любой двумерный массив с нулевыми значениями.

Давайте установим эти значения на что-то интересное:

In [52]: arr['X'] = np.arange(15).reshape(3,5)
In [53]: arr
Out[53]: 
array([([ 0,  1,  2,  3,  4], 0.), ([ 5,  6,  7,  8,  9], 0.),
       ([10, 11, 12, 13, 14], 0.)],
      dtype=[('X', '<i8', (5,)), ('Y', '<f8')])

Мы можем получить первый столбец этого поля с помощью:

In [54]: arr['X'][:,0]
Out[54]: array([ 0,  5, 10])

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

...