2011-09-12 32 views

Trả lời

16

Nếu X là mảng của bạn và c là yếu tố,

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

Xem diag_indices_from trong cuốn hướng dẫn NumPy.

14

Một cách nhanh chóng để truy cập đường chéo của một mảng NumPy vuông (n,n) là với 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 
4

Chức năng np.fill_diagonal khá nhanh:

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

nơi a là mảng của bạn và c là yếu tố của bạn. Trên máy tính của tôi, phương pháp này nhanh như phương pháp của @ kwgoodman a.flat[::n+1] /= c, và theo ý kiến ​​của tôi một chút rõ ràng hơn (nhưng không phải là bóng bẩy).

3

So sánh 3 phương pháp trên:

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] 

Vì vậy, bạn có thể thấy rằng phương pháp np.flat là nhanh nhất nhưng nhẹ. Khi tôi chạy điều này trong một vài lần có lần khi phương pháp fill_diagonal nhanh hơn một chút. Nhưng khả năng đọc khôn ngoan của nó có thể có giá trị bằng cách sử dụng phương thức fill_diagonal.

Các vấn đề liên quan