修改NumPy重组的高级索引子集

时间:2010-11-06 02:04:49

标签: python arrays indexing numpy

我有一个带有几列的重新排列,我用它来选择一个子集。像

这样的东西
>>> 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是一个副本而不是一个视图,我想知道是否有一种优雅的方法可以避免数组副本,只是根据我需要的条件使用原始文件分组数据。

2 个答案:

答案 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)]

请注意

  1. 为了相关的例子,我稍微改变了一些值和条件。

  2. 这次,maskTrue的值会再次被选中,而不会像我之前的回答那样被屏蔽。

  3. 面具==True中的condit部分是多余的,只需将其删除:)

答案 1 :(得分:2)

您可以使用“蒙面数组”:

masked = numpy.ma.array(x, 
                        mask=(x['status']!='label1')|(x['select']!=True),
                        copy=False)

请注意,掩码与condit的反转,因为掩码为True的值被屏蔽掉了。您现在可以将任何numpy ufunc应用于此蒙版数组,并且只有未屏蔽的值会受到影响。