Python 在numpy中正确执行以下操作的正确方法

Python 在numpy中正确执行以下操作的正确方法,python,numpy,Python,Numpy,我有一个有趣的谜题。假设您有一个numpy 2D数组,其中每一行对应一个测量事件,每一列对应不同的测量变量。此数组中的另一列指定进行测量的日期。这些行根据时间戳进行排序。每天有几次(或多次)测量。目标是确定与新的一天对应的行,并从该天的后续行中减去相应的值 我通过一个循环来解决这个问题,循环数天,创建一个布尔向量来选择合适的行,然后减去第一个选择的行。这种方法有效,但感觉不优雅。有更好的方法吗 只是一个小例子。下面几行定义了一个矩阵,其中第一列 是一天,其余两个是测量值 before = arr

我有一个有趣的谜题。假设您有一个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请帮我找到一个更好的,更丰富的标题为这篇文章。我没有主意了

这是一个方便的功能:

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]])
这是一个方便的功能:

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