有人可以解釋廣播(省略號)在numpy.einsum()函數中的工作原理嗎?Numpy einsum broadcast
一些示例顯示如何以及何時可以使用將不勝感激。
我檢查了下面的官方文檔頁面,但只有2個例子,我似乎無法理解如何解釋它並使用它。
http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.einsum.html
有人可以解釋廣播(省略號)在numpy.einsum()函數中的工作原理嗎?Numpy einsum broadcast
一些示例顯示如何以及何時可以使用將不勝感激。
我檢查了下面的官方文檔頁面,但只有2個例子,我似乎無法理解如何解釋它並使用它。
http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.einsum.html
省略號大致代表「所有未明確提及的其它軸」的簡寫。例如,假設你有形狀的陣列(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)
有在單元測試文件的更多例子,https://github.com/numpy/numpy/blob/master/numpy/core/tests/test_einsum.py – hpaulj