我有一个带有几列的重新排列,我用它来选择一个子集。像
这样的东西>>> 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
是一个副本而不是一个视图,我想知道是否有一种优雅的方法可以避免数组副本,只是根据我需要的条件使用原始文件分组数据。
答案 0 :(得分:3)
您在第一个回答的评论中提到的修改类型可以通过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
中的condit
部分是多余的,只需将其删除:)
答案 1 :(得分:2)
您可以使用“蒙面数组”:
masked = numpy.ma.array(x,
mask=(x['status']!='label1')|(x['select']!=True),
copy=False)
请注意,掩码与condit
的反转,因为掩码为True
的值被屏蔽掉了。您现在可以将任何numpy ufunc应用于此蒙版数组,并且只有未屏蔽的值会受到影响。