Python 在像gufunc这样的签名中,问号的确切含义是什么?
例如:Python 在像gufunc这样的签名中,问号的确切含义是什么?,python,numpy,numpy-einsum,numpy-ufunc,Python,Numpy,Numpy Einsum,Numpy Ufunc,例如: np.arange(3)@np.arange(2) # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size
np.arange(3)@np.arange(2)
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 3)
np.arange(3)@np.arange(2)
#回溯(最近一次呼叫最后一次):
#文件“”,第1行,在
#ValueError:matmul:输入操作数1的核心维度0与gufunc签名(n?,k),(k,m?)->(n?,m?)不匹配(大小2与3不同)
请注意:我知道哪里出了问题以及错误消息的含义。我只是对精确的语法感兴趣。问号表示什么?这些表示允许缺失的尺寸。如果缺少这样一个维度,它将被视为长度为1的维度,但相应的维度将从输出中删除 在matmul签名
(n?,k)、(k,m?)->(n?,m?
中,第一个参数的第一个维度和第二个参数的第二个维度都允许缺失。如果是,第一个参数将被视为行向量,第二个参数将被视为列向量
引用
matmul
包装成一个gufuncmatmul
代表矩阵乘法,如果它仅代表矩阵乘法,则可以用签名(m,n),(n,p)->(m,p)
覆盖它。但是,当维度缺失时,它有一些特殊情况,允许将任一参数视为单个向量,从而使函数有效地成为向量矩阵、矩阵向量或向量向量乘法(但没有广播)。为了支持这一点,建议允许使用问号对维度名称进行后期固定,以表明该维度不一定存在
通过此添加,matmul
的签名可以表示为(m?,n),(n,p?)->(m?,p?
。这表明,例如,如果第二个操作数只有一个维度,就初等函数而言,它将被视为输入具有核形状(n,1)
,输出具有相应的核形状(m,1)
。但是,实际的输出数组已删除了灵活的维度,即它将具有形状(…,m)
。类似地,如果两个参数只有一个维度,则输入将显示为对初等函数具有形状(1,n)
和(n,1)
,输出为(1,1)
,而实际返回的输出数组将具有形状()
。这样,签名允许对四个相关但不同的签名使用单个基本函数,(m,n)、(n,p)->(m,p)
,(n)、(n,p)->(p)
,(m,n)、(n)->(m)
和(n)、(n)->(
)