2017-11-30 32 views
5

Tôi đã theo bốn tensorsVectorising numpy.einsum

  1. H (h, r)
  2. Một (a, r) ​​
  3. D (d, r)
  4. T (a, t , r)

Đối với mỗi i trong a, có một T[i] tương ứng của hình (t, r).

tôi cần phải làm một np.einsum để tạo ra kết quả sau (pred):

pred = np.einsum('hr, ar, dr, tr ->hadt', H, A, D, T[0]) 
for i in range(a): 
    pred[:, i:i+1, :, :] = np.einsum('hr, ar, dr, tr ->HADT', H, A[i:i+1], D, T[i]) 

Tuy nhiên, tôi muốn làm tính toán này mà không cần sử dụng một vòng lặp for. Lý do là tôi đang sử dụng autograd hiện không hoạt động với các bài tập mục!

Trả lời

3

Một cách sẽ được sử dụng tất cả các kích thước cho T -

np.einsum('Hr, Ar, Dr, ATr ->HADT', H, A, D, T) 

Kể từ khi, chúng ta cần phải tổng hợp-giảm axis- r trên tất cả các đầu vào, trong khi vẫn giữ tất cả những người khác (trục) ở đầu ra, tôi don không thấy bất kỳ cách trung gian nào để thực hiện nó/đưa vào bất kỳ công cụ dựa trên dấu chấm nào để sử dụng BLAS.

+0

Cảm ơn! Tôi bằng cách nào đó (sai) nghĩ rằng nó có thể là một thực tế xấu để có cùng một nhân vật lặp đi lặp lại trong chuỗi einsum. Giống như, chúng ta có hai As trên LHS của '->'. Tôi nghĩ rằng hạn chế này áp dụng cho RHS của '->'? –

+0

@NipunBatra Lặp lại trên LHS cho các biến khác nhau có nghĩa là giữ cho chúng được căn chỉnh. Không cho phép lặp lại một biến số hoặc LHS hoặc RHS vì lý do hiển nhiên. – Divakar

+0

'ii' là dấu vết, 'ii-> i' là đường chéo. 'i, i' và 'i, i-> i' cũng ổn. Lặp lại '-> ii' trong đầu ra là sai. – hpaulj