A=np.array([
[1,2],
[3,4]
])
B=np.ones(2)
A的形状明显为2X2
numpy如何允许我计算点积np.dot(A,B)
[1,2] (dot) [1,1]
[3,4]
对于点积,B必须具有2X1的尺寸,或者更确切地说是
[1,2] (dot) [1]
[3,4] [1]
这是一个非常愚蠢的问题,但我无法弄清楚我在哪里出错?
早些时候我曾经认为np.ones(2)会给我这个:
[1]
[1]
但它给了我这个:
[1,1]
答案 0 :(得分:2)
我正在复制今天早些时候写的answer的一部分:
你应该反对将numpy数组视为拥有行的冲动 和列,但将它们视为具有 维度 和 的 形状 即可。这是区分
np.array
和np.matrix
的重要一点:x = np.array([1, 2, 3]) print(x.ndim, x.shape) # 1 (3,) y = np.matrix([1, 2, 3]) print(y.ndim, y.shape) # 2 (1, 3)
n -D数组只能使用 n 整数来表示其形状。 因此,1-D数组仅使用1个整数来指定其形状。
实际上,在1-D和2-D阵列之间组合计算不是 自
@
矩阵以来numpy和语法清理的问题 操作是在Python 3.5中引入的。因此,很少有 需要诉诸np.matrix
以满足看到的冲动 预期的行数和列数。
答案 1 :(得分:1)
此行为是设计使然。 The NumPy docs州:
如果a是N-D数组且b是1-D数组,则它是a和b的最后一个轴上的和积。
答案 2 :(得分:0)
与点积相关的矢量和矩阵形状的大多数规则主要是为了具有可以扩展为更高张量阶的相干方法。但在处理一阶(向量)和二阶(矩阵)张量时,它们并不是非常重要。这些订单是绝大多数numpy
用户所需要的。
结果,@
和np.dot
针对这些订单进行了优化(数学和输入解析),总是在第一个轴和最后一个轴的最后一个轴上求和(如果适用)第二个。 “如果适用”有点像白痴,以确保输出是绝大多数情况下的预期,即使形状在技术上不合适。
与此同时,我们这些使用高阶张量的人被降级为np.tensordot
或np.einsum
,这些都是关于维度匹配的所有琐碎的小规则。