Numpy修改ndarray对角线

xqnpmsa8  于 2023-11-18  发布在  其他
关注(0)|答案(4)|浏览(108)

在numpy中有什么方法可以得到数组对角线的引用吗?我希望我的数组对角线被某个因子所除。

zzzyeukh

zzzyeukh1#

如果X是数组,c是因子,

X[np.diag_indices_from(X)] /= c

字符串
参见Numpy手册中的diag_indices_from

goqiplq2

goqiplq22#

一种快速访问方形(n,n) numpy数组对角线的方法是使用arr.flat[::n+1]

n = 1000
c = 20
a = np.random.rand(n,n)

a[np.diag_indices_from(a)] /= c # 119 microseconds
a.flat[::n+1] /= c # 25.3 microseconds

字符串

pes8fvy9

pes8fvy93#

np.fill_diagonal函数非常快:

np.fill_diagonal(a, a.diagonal() / c)

字符串
其中a是数组,c是因子。在我的机器上,这个方法和@kwgoodman的a.flat[::n+1] /= c方法一样快,在我看来更清晰一些(但没有那么流畅)。

tpxzln5u

tpxzln5u4#

对比以上三种方法:

import numpy as np
import timeit

n = 1000
c = 20
a = np.random.rand(n,n)
a1 = a.copy()
a2 = a.copy()
a3 = a.copy()

t1 = np.zeros(1000)
t2 = np.zeros(1000)
t3 = np.zeros(1000)

for i in range(1000):
    start = timeit.default_timer()
    a1[np.diag_indices_from(a1)] /= c 
    stop = timeit.default_timer()
    t1[i] = start-stop

    start = timeit.default_timer()
    a2.flat[::n+1] /= c
    stop = timeit.default_timer()
    t2[i] = start-stop

    start = timeit.default_timer()
    np.fill_diagonal(a3,a3.diagonal() / c)
    stop = timeit.default_timer()
    t3[i] = start-stop

print([t1.mean(), t1.std()])
print([t2.mean(), t2.std()])
print([t3.mean(), t3.std()])

[-4.5693619907979154e-05, 9.3142851395411316e-06]
[-2.338075107036275e-05, 6.7119609571872443e-06]
[-2.3731951987429056e-05, 8.0455946813059586e-06]

字符串
所以你可以看到np.flat方法是最快的,但也是最小的。当我运行这个方法几次时,fill_diagonal方法稍微快一点。但从可读性的Angular 来看,它可能值得使用fill_diagonal方法。

相关问题