【发布时间】:2018-07-12 03:10:23
【问题描述】:
我在一个 numpy 数组中有大量独立的平行水平线段。每个段都有一个起点和一个终点(x 坐标),以及一个值(y 坐标)。段不一定具有相同的长度(长度 = 结束 - 开始)。
一个指定段的示例矩阵,每行一个段,如下所示:
Start End Value
0 10 4
5 19 3
6 25 2
7 16 1
12 21 5
在代码中
A = np.array([[0,10,4],
[5,19,3],
[6,25,2],
[7,16,1],
[12,21,5]])
我想计算线段上的运行最大值。也就是说,在上面的例子中,对于 [0,25) 范围内的 x,我想要对应的最大 y。与示例对应的示例输出将是
Start End Max
0 10 4
10 12 3
12 21 5
21 25 2
我可以在 for 循环中执行此操作,但这很慢,因为我有数万个段。我似乎想不出一种方法来矢量化它。有人可以吗?
循环代码示例:
x = np.arange(np.min(A[:,0]), np.max(A[:,1]))
maxes = np.zeros((x.shape[0], 2))
maxes[:,0] = x
maxes[:,1] = -np.inf
for a in A:
ix = (x >= a[0]) & (x < a[1]) & (maxes[:,1] < a[2])
maxes[ix,1] = a[2]
此代码输出一个数组,范围内的每个 x 对应一行,与上面的输出示例相反。两者都很好(并且等效)。
【问题讨论】:
-
为 numpy 数组添加示例案例?另外,段之间会不会有重叠?
-
@Divakar:感谢您的提问。如果您指的是示例数组,请参阅我在第一个代码块中提供的示例。是的,可以有重叠;请参阅第一个代码块中的示例。
-
@Matt 我猜 Divakar 正在谈论为数组添加一个 executable 示例案例,可以将其复制到 python 控制台并生成一个看起来与您的完全一样的数组提供了样本数据。
-
@Scotty1- 好的,添加了代码 sn-p。希望澄清一下。
-
@Scotty1- 完成。感谢您帮助使问题更清晰。