2016-06-08 77 views
2

有人可以解釋廣播(省略號)在numpy.einsum()函數中的工作原理嗎?Numpy einsum broadcast

一些示例顯示如何以及何時可以使用將不勝感激。

我檢查了下面的官方文檔頁面,但只有2個例子,我似乎無法理解如何解釋它並使用它。

http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.einsum.html

+0

有在單元測試文件的更多例子,https://github.com/numpy/numpy/blob/master/numpy/core/tests/test_einsum.py – hpaulj

回答

5

省略號大致代表「所有未明確提及的其它軸」的簡寫。例如,假設你有形狀的陣列(2,3,4,5,6,6):

import numpy as np 
arr = np.random.random((2,3,4,5,6,6)) 

,並要採取跟蹤沿其最後兩軸:

result = np.einsum('ijklmm->ijklm', arr) 
result.shape 
# (2, 3, 4, 5, 6) 

一個等價的方式做這將是

result2 = np.einsum('...mm->...m', arr) 
assert np.allclose(result, result2) 

的省略號提供(在這種情況下)的速記符號意義「所有的 軸向左」。 ...代表ijkl

一個約不必是顯式的好處是,

np.einsum('...mm->...m', arr) 

同樣適用與任何數目的維度> = 2(只要最後兩個具有相等長度),而

的陣列
np.einsum('ijklmm->ijklm', arr) 

僅當arr恰好具有6個維度時才起作用。


當省略號出現在中間,這是簡寫形式,「所有的中軸線 沒有明確提及」。例如,下面的np.einsum('ijklmi->ijklm', arr) 相當於np.einsum('i...i->i...', arr)。在這裏,...代表jklm

arr = np.random.random((6,2,3,4,5,6)) 
result = np.einsum('ijklmi->ijklm', arr) 
result2 = np.einsum('i...i->i...', arr) 
assert np.allclose(result, result2)