【问题标题】:Numpy einsum broadcastingNumpy einsum 广播
【发布时间】:2016-06-08 23:15:48
【问题描述】:

有人能解释一下广播(省略号)在 numpy.einsum() 函数中是如何工作的吗?

非常感谢您提供一些示例来说明如何以及何时使用它。

我查看了以下官方文档页面,但只有 2 个示例,我似乎无法理解如何解释和使用它。

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

【问题讨论】:

标签: python numpy numpy-einsum


【解决方案1】:

省略号是粗略表示“所有未明确提及的剩余轴”的简写。例如,假设您有一个形状数组 (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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 2023-03-20
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多