Python Numpy结构化数组(recarray)将值分配到切片中

6
以下示例展示了我想要做的事情:
>>> 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分配相同的值。 我尝试了很多方法,但从未成功过。 有没有办法做到这一点?
谢谢, Joon

1
还可以参考@HYRY的回答稍有不同的问题,该回答提供了一个很好的解决方案。 - katahdin
1个回答

5
当您输入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)]

要深入了解更多细节,请查看 Robert Kern 的 这篇文章

非常感谢。所以问题出在字段访问上。 - joon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接