修改NumPy Recarray的高级索引子集

我有一个带有几个用于选择子集的列的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部分是多余的,只需将其省略即可:)

上一篇:如何在数组索引中使用“和”运算符?


下一篇:MySQL-索引中有许多列?还是一一?