Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Đánh giá thứ tự co giãn chi phí thấp nhất cho biểu thức einsum trong Python

Để lấy thứ tự co giãn chi phí thấp nhất cho biểu thức einsum, sử dụng phương thức numpy.einsum_path() trong Python. Tham số đầu tiên subscripts chỉ định chỉ số con cho phép tính tổng. Tham số thứ hai operands là các mảng cho phép toán.

Sử dụng quy ước tổng Einstein, nhiều phép toán mảng đại số tuyến tính đa chiều phổ biến có thể được biểu diễn theo cách đơn giản. Ở chế độ ngầm định, einsum tính toán các giá trị này.

Ở chế độ tường minh, einsum cung cấp sự linh hoạt hơn để tính toán các phép toán mảng khác có thể không được coi là phép toán tổng Einstein cổ điển, bằng cách vô hiệu hóa hoặc ép buộc tính tổng trên các nhãn chỉ số con được chỉ định.

Con đường kết quả cho biết các hạng tử của phép co giãn đầu vào nên được co giãn trước, kết quả của phép co giãn này sau đó được thêm vào cuối danh sách co giãn. Danh sách này sau đó có thể được lặp lại cho đến khi tất cả các phép co giãn trung gian hoàn tất.

Các bước

Trước tiên, nhập thư viện cần thiết:

import numpy as np

Các tensor:

p = np.random.rand(2, 2)
q = np.random.rand(2, 5)
r = np.random.rand(5, 2)

Để lấy thứ tự co giãn chi phí thấp nhất cho biểu thức einsum, sử dụng phương thức numpy.einsum_path():

path_info = np.einsum_path('ij,jk,kl->il', p, q, r, optimize='greedy')

Hiển thị thông tin đường đi:

print(path_info[0])
print(path_info[1])

Ví dụ hoàn chỉnh

import numpy as np
np.random.seed(123)

# Các tensor
p = np.random.rand(2, 2)
q = np.random.rand(2, 5)
r = np.random.rand(5, 2)

# Lấy thứ tự co giãn tối ưu
path_info = np.einsum_path('ij,jk,kl->il', p, q, r, optimize='greedy')

# Hiển thị thông tin đường đi
print(path_info[0])
print(path_info[1])

Kết quả

['einsum_path', (1, 2), (0, 1)]
Complete contraction: ij,jk,kl->il
Naive scaling: 4
Optimized scaling: 3
Naive FLOP count: 1.200e+02
Optimized FLOP count: 5.700e+01
Theoretical speedup: 2.105
Largest intermediate: 4.000e+00 elements
--------------------------------------------------------------------------
scaling       current       remaining
--------------------------------------------------------------------------
3             kl,jk->jl     ij,jl->il
3             jl,ij->il     il->il