2012-03-22 51 views
1

我想将矩阵的N个值分配给长矩阵列中的N个条目,其中a布尔值掩码选择N条目。我做错了,因为大矩阵保持不变。请参见下一个示例:在numpy中,如何将大小为N的数组分配给具有布尔掩码的较大阵列

大矩阵中的每个条目都包含一个时间戳,一个有效标志和一个空字段,以及自上一个有效条目以来的时间。我要计算这些时间流逝:

a = np.array([(0,0,0), 
     (1,0,0), 
     (2,1,0), 
     (3,1,0), 
     (4,1,0), 
     (5,0,0), 
     (6,0,0), 
     (7,0,0), 
     (8,1,0), 
     (9,1,0)], 
     dtype=np.dtype([('time', '<i4'), ('ena', '|b1'), ('elapsed', '<i4')])) 

计算与先前东窗事发项时差:

elapsed = a[a['ena']]['timestamp'][1:] - a[a['ena']]['timestamp'][0:-1] 

经过将[1,1,4,1],(这是我想要的东西)。 现在我想经过秒写入原始数组:

a[a['ena']]['step_secs'][1:] = timestep 

没有警告或错误,但保持不变,虽然我的预期:

a = np.array([ 
     (0,0,0), 
     (1,0,0), 
     (2,1,0), 
     (3,1,1), 
     (4,1,1), 
     (5,0,0), 
     (6,0,0), 
     (7,0,0), 
     (8,1,4), 
     (9,1,1)] 

我应该怎么办呢?非常感谢。

回答

1

numpy人已经做了一些惊人的魔术,使花哨的索引(其中包括布尔索引)的工作,以及它的确如此。这种魔法非常令人印象深刻,但它仍然无法处理花哨的索引,然后在作业左侧进行更多索引,例如a[fancy][index2] = something。下面是一个简单的例子:

>>> a = np.zeros(3) 
>>> b = np.array([True, False, True]) 
>>> a[b][1:] = 2 
array([ 0., 0., 0.]) 
>>> a[1:][b[1:]] = 2 
array([ 0., 0., 2.]) 

,我认为这是一个错误,我不知道是否有可能赶上它和提高,而不是让它静静地失败的错误。但要回到你的问题,最简单的解决方案似乎是替换:

a[a['ena']]['step_secs'][1:] = timestep 

有:

tmp = a['ena'][1:] 
a['step_secs'][1:][tmp] = timestep 

或可能:

a['step_secs'][1:][a['ena'][1:]] = timestep 
+0

谢谢!这真的有帮助。我最后做了什么,以避免切割面具,并在最后留下智能索引: stepsecs = np.concatenate(([0], stepsecs))
a['step_secs']['ena'] = stepsecs

这没有把戏。 我想我会报告这是一个numpy错误:聪明的索引应该不会默默地失败 - 它应该或者(I)预期或抛出异常。 – Lobotomik 2012-03-27 12:23:46

+0

对不起,在上面的回复格式非常糟糕 - 我无法弄清楚如何使它在视觉上可以接受的5'允许编辑。 – Lobotomik 2012-03-27 12:30:42

+0

我不确定这是不可能的,如果在python级别没有改变,或者对numpy的工作方式做了很多修改,有人已经提交了关于此的票。 http://projects.scipy.org/numpy/ticket/224 – 2012-03-27 15:57:01

相关问题