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

标签 python numpy

我有一个有趣的谜题。假设您有一个 numpy 二维数组,其中每一行对应一个测量事件,每一列对应不同的测量变量。该数组中的另一列指定进行测量的日期。这些行根据时间戳进行排序。每天有几次(或多次)测量。目标是识别与新的一天相对应的行,并从当天的后续行中减去相应的值。

我通过循环几天的循环来解决这个问题,创建一个 bool 向量来选择正确的行,然后减去第一个选定的行。这种方法可行,但感觉不优雅。有更好的方法吗?

只是一个小例子。下面的行定义了一个矩阵,其中第一列 为日期,其余两位为测量值

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 请帮助我为这篇文章找到一个更好、信息更丰富的标题。我没主意了

最佳答案

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

关于python - 在 numpy 中正确执行以下操作的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11537869/

相关文章:

python - .ply 多边形网格到 2D 深度图

javascript - 使用 Scrapy 模拟 JavaScript 按钮点击

python - 如何通过索引而不是名称获取列?

数组的每个术语的 Numpy 均值和标准差

python - Python 中使用 numpy 数组进行高效的逐元素乘法

python - 尝试在 Windows 7 中的 Anaconda(python) 上安装 pymc 并出现奇怪的错误?

python - 在 Beautifulsoup Python 上排除不需要的标签

python - 使用 apply + 函数为 pandas 数据框创建多个新列

python - Numpy Matrix 逆与 float128 类型

c - 使用 cblas_sgemm 执行复杂的矩阵操作以进行乘法