đây là một cách tốt để làm điều này.. Nếu bạn muốn có một cái nhìn một chiều sử dụng đường chéo chính của mảng:
A.ravel()[:A.shape[1]**2:A.shape[1]+1]
Đối với i'th sử dụng superdiagonal:
A.ravel()[i:max(0,A.shape[1]-i)*A.shape[1]:A.shape[1]+1]
Đối với i'th sử dụng subdiagonal:
A.ravel()[A.shape[1]*i:A.shape[1]*(i+A.shape[1]):A.shape[1]+1]
Hoặc nói chung, đối với đường chéo thứ i nơi đường chéo chính là 0, các đường phụ là số âm và đường siêu hình là số dương, sử dụng:
A.ravel()[max(i,-A.shape[1]*i):max(0,(A.shape[1]-i))*A.shape[1]:A.shape[1]+1]
Đây là những quan điểm và không sao chép, vì vậy họ sẽ chạy nhanh hơn để trích xuất một đường chéo, nhưng bất cứ thay đổi nào đối tượng mảng mới sẽ áp dụng cho các mảng ban đầu. Trên máy của tôi, chúng chạy nhanh hơn hàm fill_diagonal khi thiết lập đường chéo chính thành hằng số, nhưng điều đó có thể không phải lúc nào cũng đúng. Chúng cũng có thể được sử dụng để gán một mảng các giá trị cho một đường chéo thay vì chỉ là một hằng số.
Lưu ý: đối với mảng nhỏ, có thể sử dụng thuộc tính flat
của mảng NumPy nhanh hơn. Nếu tốc độ là một vấn đề lớn, nó có thể là giá trị để biến A.shape[1]
biến cục bộ. Ngoài ra, nếu mảng không tiếp giáp, ravel()
sẽ trả về một bản sao, do đó, để gán các giá trị cho một lát cắt, cần phải tạo một cách sáng tạo mảng ban đầu được sử dụng để tạo slice được cắt (nếu nó tiếp giáp) hoặc sử dụng thuộc tính flat
.
Ngoài ra, ban đầu nó được lên kế hoạch rằng trong NumPy 1.10 và sau đó phương pháp 'chéo' của mảng sẽ trả về dạng xem thay vì sao chép. Thay đổi đó vẫn chưa được thực hiện mặc dù, nhưng hy vọng tại một số điểm lừa này để có được một cái nhìn sẽ không còn cần thiết. Xem http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.diagonal.html
Bạn đang sử dụng phiên bản nào? 'np.diag_indices_from' được thêm vào trong v1.4 – JoshAdel
vâng, bạn nói đúng, tôi hiện đang sử dụng python v 1.3.0 – pacodelumberg
@LangerHansIslands Hy vọng rằng bạn có nghĩa là gumpy 1.3, không phải python 1.3 (xuất hiện vào giữa những năm chín mươi). .: p) – Dougal