gpt4 book ai didi

python - Numpy 数组反转对角线

转载 作者:行者123 更新时间:2023-12-04 15:24:58 29 4
gpt4 key购买 nike

在 numpy 中是否有一种简单的方法可以反转矩阵对角线的顺序?我有一个像这样的 2x2 矩阵:

[ 213 5
198 24 ]

但我希望它是这样的:

[ 24  5
198 213 ]

我玩过 np.diagonal,但不确定如何在没有循环的情况下高效地完成此操作。

最佳答案

这是一个 np.einsum -

def flip_diag(a):
w = np.einsum('ii->i',a)
w[:] = w[::-1]
return a

另一个 np.fill_diagonal -

np.fill_diagonal(a,np.diag(a)[::-1].copy())

另一个带有扁平索引的 -

a.flat[::a.shape[1]+1] = a.flat[::-a.shape[1]-1]

基准测试

作为函数的解决方案:

# @Quang Hoang's soln
def range_diagonal(a):
idx = np.arange(len(a))
a[idx,idx] = np.diagonal(a)[::-1]
return a

def fill_diagonal(a):
np.fill_diagonal(a,np.diag(a)[::-1].copy())
return a

def flattened_index(a):
a.flat[::a.shape[1]+1] = a.flat[::-a.shape[1]-1]
return a

使用 benchit包(几个基准测试工具打包在一起;免责声明:我是它的作者)来基准测试建议的解决方案。

import benchit

funcs = [range_diagonal, flip_diag, fill_diagonal, flattened_index]
in_ = [np.random.rand(n,n) for n in [2,5,8,20,50,80,200,500,800,2000,5000]]
t = benchit.timings(funcs, in_)
t.plot(logx=True, save='timings.png')

enter image description here

flip_diagflattened_index 看起来不错,可以根据输入数组大小选择其中之一。

关于python - Numpy 数组反转对角线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62458924/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com