2010-06-17 73 views
6

下面的例子显示了我想做的事:的Python NumPy的结构数组(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分配相同的值。我已经尝试了许多方法,但都没成功。有没有办法做到这一点?

谢谢 俊

+1

另请参阅@HYRY [回答稍微不同的问题](http://stackoverflow.com/a/21819324/347815),它可以很好地解决这个问题。 – katahdin 2014-06-09 14:42:02

回答

4

当你说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)] 

对于引擎盖下从深层次看,看到this post by Robert Kern

+0

非常感谢。所以问题在于现场访问。 – joon 2010-06-17 03:21:22