在numpy中,如何将大小为N的数组分配给具有布尔mas的较大数组

2024-10-04 05:27:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我想给一个长得多的矩阵列中的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')]))

要计算与以前未屏蔽条目的时差,请执行以下操作:

^{pr2}$

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

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

没有警告或错误,但a保持不变,尽管我预期:

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

我该怎么做?非常感谢。在


Tags: 示例time标志np时间条目矩阵array
1条回答
网友
1楼 · 发布于 2024-10-04 05:27:50

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.])

我认为这是一个bug,我想知道是否有可能捕捉到它并引发一个错误,而不是让它默默地失败。但回到你的问题上,最简单的解决方法似乎是替换:

^{pr2}$

有:

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

或者可能:

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

相关问题 更多 >