Как заполнить несколько именованных полей, используя структурированные данные
Я хотел бы взять информацию из некоторых полей и просто записать их в другую переменную, используя список.
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))
(составной вид более компактен, но не быстрее).