2010-06-17 6 views
6

El siguiente ejemplo muestra lo que quiero hacer:Python Numpy matriz estructurado (recArray) la asignación de valores en rodajas

>>> 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) 

Por lo tanto, quiero asignar los valores (1,1) a test[['ifAction', 'ifDocu']][0]. (Con el tiempo, quiero hacer algo como test[['ifAction', 'ifDocu']][0:10] = (1,1), la asignación de los mismos valores para a 0:10. He intentado muchas maneras, pero nunca tuvo éxito. ¿Hay alguna manera de hacer esto?

Gracias, Joon

+1

También vea @ HYRY [respuesta a una pregunta ligeramente diferente] (http://stackoverflow.com/a/21819324/347815) que ofrece una excelente solución a este problema. – katahdin

Respuesta

4

Cuando dices test['ifAction'] obtienes una vista de los datos Cuando dices test[['ifAction','ifDocu']] estás usando la indexación de fantasía y así obtienes una copia de los datos. La copia no te ayuda ya que modificar la copia deja los datos originales sin cambios.

Así que una forma de evitar esto es asignar valores a test['ifAction'] y test['ifDocu'] individualmente:

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

Por ejemplo:

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)] 

Para una mirada más profunda bajo el capó, véase this post by Robert Kern.

+0

Muchas gracias. Entonces el problema fue con el acceso de campo. – joon

Cuestiones relacionadas