Python Numpy合并2列值

Python Numpy合并2列值,python,numpy,merge,Python,Numpy,Merge,假设我有一个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]] 我找到了解决办法。但是,还有比这更好的方法吗?我不知道这是否是最好的,但它有点聪明 In [66]: np.add.reduceat(arr[:,[0,3,1,2]], [0,2,3], axis=1) Out[66]: arra

假设我有一个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]]

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

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

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

reduceat
add
应用于列组(轴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)
are=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)

因此,链接中的解决方案非常经济,它采用计算+即时视图。

链接的答案有什么问题?数组的大小是不可变的,因此必须创建不同大小的副本或视图。链接的解决方案使用通常比复制更快的视图,它可能工作得很好,而且可读性很好。“花哨”的NumPy OneLiner往往很快变得无法阅读……我不想在这里进行解构,但与“直接”解决方案相比,这读起来更复杂,执行速度也更慢。这是“不同的”,我给你,但更好的。。。?