【问题标题】:Numpy merge 2 columns valuesNumpy合并2列值
【发布时间】:2025-12-08 14:10:02
【问题描述】:

假设我有这个 numpy 数组:

[[3 2 1 5]
 [3 2 1 5]
 [3 2 1 5]
 [3 2 1 5]]

如何将最后一列的值合并到第一列(或任何列到任何列)。预期输出:

[[8 2 1]
 [8 2 1]
 [8 2 1]
 [8 2 1]]

我找到了this 解决方案。但是,还有比这更好的方法吗?

【问题讨论】:

  • 你链接的答案有什么问题?
  • 数组的大小是不可变的,因此必须创建一个不同大小的副本或视图。链接的解决方案使用通常比复制更快的视图,它可能运行良好。
  • 另外它的可读性很好。 “花哨”的 NumPy oneliners 往往会很快变得难以阅读......

标签: python numpy merge


【解决方案1】:

根据评论,您需要创建数组的视图或副本才能获得不同大小的新数组。这是视图与复制性能的简短比较:

x = np.tile([1,3,2,4],(4,1))
def f(x):
    # calculation + view
    x[:,0] = x[:,0] + x[:,-1]
    return x[:,:-1]

def g(x):
    # calculation + copy
    x[:,0] = x[:,0] + x[:,-1]
    return np.delete(x,-1, 1)

def h(x):
    #calculation only
    x[:,0] = x[:,0] + x[:,-1]

%timeit f(x)
%timeit g(x)
%timeit h(x)

9.16 µs ± 1.1 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)
35 µs ± 7.35 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
7.81 µs ± 1.42 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)

如果len(x) = 1M:

6.13 ms ± 623 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
18 ms ± 2.37 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
5.83 ms ± 720 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

所以链接中的解决方案非常经济,它应用了计算+即时查看。

【讨论】:

    【解决方案2】:

    我不知道这是否是最好的,但它有点聪明。

    In [66]: np.add.reduceat(arr[:,[0,3,1,2]], [0,2,3], axis=1)
    Out[66]: 
    array([[8, 2, 1],
           [8, 2, 1],
           [8, 2, 1]])
    

    reduceatadd 应用于列组(轴 1)。我首先对列重新排序以将要添加的列放在一起。

    【讨论】:

    • 不想在这里解构,但与“直截了当”的解决方案相比,这读起来更复杂,执行速度也更慢。它是“不同的”,我给你的,但更好......?