Python Numpy Structured Array (recarray), присваивающий значения фрагментам

В следующем примере показано, что я хочу сделать:

>>> test
rec.array([(0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0),
   (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)], 
  dtype=[('ifAction', '|i1'), ('ifDocu', '|i1'), ('ifComedy', '|i1')])

>>> test[['ifAction', 'ifDocu']][0]
(0, 0)

>>> test[['ifAction', 'ifDocu']][0] = (1,1)
>>> test[['ifAction', 'ifDocu']][0]
(0, 0)

Итак, я хочу присвоить значения (1,1) test[['ifAction', 'ifDocu']][0]. (В конце концов, я хочу сделать что-то вроде test[['ifAction', 'ifDocu']][0:10] = (1,1), назначив те же значения для 0:10. Я пробовал много способов, но так и не преуспел. Есть ли способ сделать это?

Спасибо, Джун


person joon    schedule 17.06.2010    source источник
comment
Также см. ответ @HYRY на немного другой вопрос, который дает отличное решение этой проблемы.   -  person katahdin    schedule 09.06.2014


Ответы (1)


Когда вы говорите test['ifAction'], вы получаете представление данных. Когда вы говорите test[['ifAction','ifDocu']], вы используете причудливую индексацию и, таким образом, получаете копию данных. Копия вам не поможет, так как изменение копии оставляет исходные данные без изменений.

Таким образом, способ обойти это — присвоить значения test['ifAction'] и test['ifDocu'] по отдельности:

test['ifAction'][0]=1
test['ifDocu'][0]=1

Например:

import numpy as np
test=np.rec.array([(0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0),
   (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)], 
  dtype=[('ifAction', '|i1'), ('ifDocu', '|i1'), ('ifComedy', '|i1')])

print(test[['ifAction','ifDocu']])
# [(0, 0) (0, 0) (0, 0) (0, 0) (0, 0) (0, 0) (0, 0) (0, 0) (0, 0) (0, 0)]
test['ifAction'][0]=1
test['ifDocu'][0]=1

print(test[['ifAction','ifDocu']][0])
# (1, 1)
test['ifAction'][0:10]=1
test['ifDocu'][0:10]=1

print(test[['ifAction','ifDocu']])
# [(1, 1) (1, 1) (1, 1) (1, 1) (1, 1) (1, 1) (1, 1) (1, 1) (1, 1) (1, 1)]

Чтобы глубже заглянуть под капот, см. эту публикацию Роберта Керна. .

person unutbu    schedule 17.06.2010
comment
Большое тебе спасибо. Так что проблема была с доступом к полю. - person joon; 17.06.2010