我有一个 recarray,其中包含几个用于选择子集的列。有点像
>>> x
array([ ('label1',True,3),
('label2',True,2),
('label1',False,4)],
dtype=[('status', '|S16'), ('select', '|b1'), ('somedata', '<i4')])
使用类似于 previous SO question 的方法从此数组中选择数据.
condit=(x['status']=='label1')&(x['select']==True)
x_subids=numpy.where(condit)[0]
x_sub=x[x_subids]
然后我在子集上做一些工作并更新原始的。
x[x_subids]=x_sub
我知道 x_sub
是一个副本而不是一个 View ,因为高级索引,我想知道是否有一种优雅的方法来避免数组复制并只在给定条件的情况下使用原始文件我需要对数据进行子集化。
最佳答案
您在我的第一个答案的评论中提到的那种修改可以用 numpy.place()
function 完成:
>>> import numpy >>> x = numpy.array([("label1",True,3), ("label2",False,2), ("label1",True,4)], ... dtype=[("status", "|S16"), ("select", "|b1"), ("somedata", ">> mask = x["select"] >>> numpy.place(x["somedata"], mask, (5, 6)) >>> print x [('label1', True, 5) ('label2', False, 2) ('label1', True, 6)] >>> numpy.place(x["status"], mask, "label3") >>> print x [('label3', True, 5) ('label2', False, 2) ('label3', True, 6)]
注意
为了相关示例,我稍微更改了值和条件。
这一次,再次选择
mask
为True
的值,而不是像我之前的回答那样被屏蔽掉。掩码
condit
中的==True
部分是多余的,只需将其删除 :)
关于python - 就地修改 NumPy recarray 的高级索引子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4111514/