Computer >> Máy Tính >  >> Lập trình >> Python

Đánh giá thứ tự thu hẹp chi phí thấp nhất cho một biểu thức einsum trong Python

Để có được thứ tự thu hẹp chi phí thấp nhất cho một biểu thức einsum, hãy sử dụng phương thức numpy.einsum + path () trong Python. Tham số đầu tiên, các chỉ số phụ chỉ định các chỉ số phụ để tổng kết. Tham số thứ 2, toán hạng là các mảng cho phép toán.

Sử dụng quy ước tổng kết 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. Trong chế độ ngầm định, einsum tính toán các giá trị này.

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

Đường dẫn kết quả cho biết điều khoản nào của sự co đầu vào nên được ký hợp đồng trước, kết quả của sự co lại này sau đó được thêm vào cuối danh sách co lại. Danh sách này sau đó có thể được nhắc lại cho đến khi tất cả các cơn co thắt trung gian hoàn tất.

Các bước

Đầu tiên, hãy nhập các thư viện được yêu cầu -

import numpy as np

Tensors -

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

Để có được thứ tự thu hẹp chi phí thấp nhất cho một biểu thức einsum, hãy sử dụng phương thức numpy.einsum + path () -

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

Thông tin đường dẫn hiển thị -

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

Ví dụ

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

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

# To get the lowest cost contraction order for an einsum expression, use the numpy.einsum+path() method in Python
path_info = np.einsum_path('ij,jk,kl->il', p, q, r, optimize='greedy')

# Displaying Path info
print(path_info[0])
print(path_info[1])

Đầu ra

['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