我有一个有趣的谜题。假设您有一个numpy 2D数组,其中每一行对应一个测量事件,每列对应不同的测量变量。此数组中的另一列指定了测量的日期。这些行根据时间戳排序。每天有几个(或许多)测量值。目标是识别与新日相对应的行,并从当天的后续行中减去相应的值。
我通过一个遍历循环的循环来解决这个问题,创建一个布尔向量,选择正确的行,然后减去第一个选定的行。这种方法有效,但感觉不优雅。有更好的方法吗?
只是一个小例子。下面的行定义了第一列的矩阵 是一天,其余两个是测量值
before = array([[ 1, 1, 2],
[ 1, 3, 4],
[ 1, 5, 6],
[ 2, 7, 8],
[ 3, 9, 10],
[ 3, 11, 12],
[ 3, 13, 14]])
在流程结束时,我希望看到以下数组:
array([[1, 0, 0],
[1, 2, 2],
[1, 4, 4],
[2, 0, 0],
[3, 0, 0],
[3, 2, 2],
[3, 4, 4]])
PS请帮助我为这篇文章找到更好,更丰富的标题。我没有想法
答案 0 :(得分:4)
numpy.searchsorted
是一个方便的功能:
In : before
Out:
array([[ 1, 1, 2],
[ 1, 3, 4],
[ 1, 5, 6],
[ 2, 7, 8],
[ 3, 9, 10],
[ 3, 11, 12],
[ 3, 13, 14]])
In : diff = before[before[:,0].searchsorted(x[:,0])]
In : diff[:,0] = 0
In : before - diff
Out:
array([[1, 0, 0],
[1, 2, 2],
[1, 4, 4],
[2, 0, 0],
[3, 0, 0],
[3, 2, 2],
[3, 4, 4]])
更长的解释
如果您选择第一列并搜索自身,则会获得这些特定值的最小索引:
In : before
Out:
array([[ 1, 1, 2],
[ 1, 3, 4],
[ 1, 5, 6],
[ 2, 7, 8],
[ 3, 9, 10],
[ 3, 11, 12],
[ 3, 13, 14]])
In : before[:,0].searchsorted(x[:,0])
Out: array([0, 0, 0, 3, 4, 4, 4])
然后,您可以使用它来构建您将通过索引减去的矩阵:
In : diff = before[before[:,0].searchsorted(x[:,0])]
In : diff
Out:
array([[ 1, 1, 2],
[ 1, 1, 2],
[ 1, 1, 2],
[ 2, 7, 8],
[ 3, 9, 10],
[ 3, 9, 10],
[ 3, 9, 10]])
您需要制作第一列0
,以便不会扣除它们。
In : diff[:,0] = 0
In : diff
Out:
array([[ 0, 1, 2],
[ 0, 1, 2],
[ 0, 1, 2],
[ 0, 7, 8],
[ 0, 9, 10],
[ 0, 9, 10],
[ 0, 9, 10]])
最后,减去两个矩阵以获得所需的输出:
In : before - diff
Out:
array([[1, 0, 0],
[1, 2, 2],
[1, 4, 4],
[2, 0, 0],
[3, 0, 0],
[3, 2, 2],
[3, 4, 4]])