我想在一个更长矩阵的列中为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)]
我该怎么办?非常感谢。
答案 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