在numpy中,如何使用布尔掩码将大小为N的数组分配给更大的数组

时间:2012-03-22 14:18:23

标签: python numpy

我想在一个更长矩阵的列中为N个条目分配一个矩阵N值,其中一个布尔掩码选择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 个答案:

答案 0 :(得分: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