Как заполнить несколько именованных полей, используя структурированные данные

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

import numpy as np
var1 = np.array([(1,2,3,4),(11,22,33,44),(111,222,333,444)], dtype=([('field1', 'int32'),('field2','int32'),('field3','int32'),('field4','int32')]))
var2 = np.empty((1), dtype = ([('field1', 'int32'),('field2','int32'),('field5','int32'),('field6','int32')]))
myList = ['field1', 'field2']

Я хочу записать значения из 1-го и 2-го полей и 1-й строки в var2. Я пробую следующее:

var2[(myList)] = var1[(myList)][0]

Но я получаю следующую ошибку:

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

Что я хочу добиться того же, если я выполняю:

var2['field1'] = var1['field1'][0]
var2['field2'] = var1['field2'][0]

Как я мог сделать это, чтобы иметь возможность выполнять это с более высокими списками, избегая цикла for по списку?

1 ответ

Список полей работает для извлечения подмножества полей

In [139]: var1[myList]
Out[139]: 
array([(1, 2), (11, 22), (111, 222)], 
      dtype=[('field1', '<i4'), ('field2', '<i4')])

но не при использовании на левой стороне в качестве "сеттера" (это может быть областью развития).

In [138]: var2[myList]= var1[myList]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-138-570d16e71a2e> in <module>()
----> 1 var2[myList]= var1[myList]

IndexError: unsupported iterator index

Так что вам нужно перебирать поля.

for name in myList:
    var2[name] = var1[name][0]     

Итерации по именам полей - обычная практика в коде структурированного массива (как в np.rec функции). Как правило, структурированный массив будет иметь много элементов ("строк"), но несколько полей ("столбцов"), поэтому итерация по полям обходится недорого.


В этом случае все поля var2 подобные int DTYPE. Таким образом, я могу выполнить назначение на соответствующем 2-м виде

In [160]: var2.view(int)[:2] = var1[myList][0].tolist()

var2 Все данные в буфере данных, поэтому его можно просматривать как поля или как обычный массив (2d или 1).

var2.view(int)[:2] = var1[myList][0] правопреемники var1['field1'][0] на оба предмета var2, Поэтому я должен сделать это в виде списка или кортежа.

Или я могу посмотреть var1 также. С этим я обнаружил, что мне нужно reshape также. view создает вид массива 1d буфера

var2.view(int)[:2]=var1.view(int).reshape((3,4))[0,:2]

Многопрофильное задание находится в стадии разработки, но я не думаю, что оно еще находится в официальном релизе. https://github.com/numpy/numpy/pull/6053


var1.view(int).reshape((3,4))  # or 
var1.view(int).reshape((-1,4))

также может быть выражено как:

var1.view((int,4))

(составной вид более компактен, но не быстрее).

Другие вопросы по тегам