在numpy中有什么方法可以得到数组对角线的引用吗?我希望我的数组对角线被某个因子所除。
zzzyeukh1#
如果X是数组,c是因子,
X
c
X[np.diag_indices_from(X)] /= c
字符串参见Numpy手册中的diag_indices_from。
diag_indices_from
goqiplq22#
一种快速访问方形(n,n) numpy数组对角线的方法是使用arr.flat[::n+1]:
(n,n)
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
字符串
pes8fvy93#
np.fill_diagonal函数非常快:
np.fill_diagonal
np.fill_diagonal(a, a.diagonal() / c)
字符串其中a是数组,c是因子。在我的机器上,这个方法和@kwgoodman的a.flat[::n+1] /= c方法一样快,在我看来更清晰一些(但没有那么流畅)。
a
a.flat[::n+1] /= c
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方法。
np.flat
fill_diagonal
4条答案
按热度按时间zzzyeukh1#
如果
X
是数组,c
是因子,字符串
参见Numpy手册中的
diag_indices_from
。goqiplq22#
一种快速访问方形
(n,n)
numpy数组对角线的方法是使用arr.flat[::n+1]
:字符串
pes8fvy93#
np.fill_diagonal
函数非常快:字符串
其中
a
是数组,c
是因子。在我的机器上,这个方法和@kwgoodman的a.flat[::n+1] /= c
方法一样快,在我看来更清晰一些(但没有那么流畅)。tpxzln5u4#
对比以上三种方法:
字符串
所以你可以看到
np.flat
方法是最快的,但也是最小的。当我运行这个方法几次时,fill_diagonal
方法稍微快一点。但从可读性的Angular 来看,它可能值得使用fill_diagonal方法。