2010-06-17 11 views
6

L'exemple suivant montre ce que je veux faire:Python Numpy Tableau (Structured recarray) attribuer des valeurs en tranches

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

, je veux donc affecter les valeurs (1,1)-test[['ifAction', 'ifDocu']][0]. (Par la suite, je veux faire quelque chose comme test[['ifAction', 'ifDocu']][0:10] = (1,1), attribuer les mêmes valeurs pour 0:10. J'ai essayé plusieurs façons, mais jamais réussi. Est-il possible de le faire?

Merci, Joon

+1

Voir aussi @ HYRY [réponse à une question légèrement différente] (http://stackoverflow.com/a/21819324/347815) qui donne une excellente solution à ce problème. – katahdin

Répondre

4

Lorsque Lorsque vous dites test[['ifAction','ifDocu']] vous utilisez l'indexation fantaisie et donc obtenir une copie des données.La copie ne vous aide pas depuis la modification de la copie laisse les données originales inchangées

Donc, un moyen de contourner cela est d'attribuer des valeurs à test['ifAction'] et test['ifDocu'] individuellement:

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

Par exemple:

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

Pour un regard plus profond sous le capot, voir this post by Robert Kern.

+0

Merci beaucoup. Donc, le problème était avec l'accès au terrain. – joon