我有一个带有几个用于选择子集的列的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是一个副本而不是视图,并且我想知道是否存在一种优雅的方式来避免数组副本,并且在需要对数据进行子集化的条件下仅使用原始副本.
解决方法:
您在第一个答案的注释中提到的修改类型可以通过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的值,而不是像我以前的答案那样被屏蔽掉.
>遮罩条件中的== True部分是多余的,只需将其省略即可:)