【发布时间】:2021-06-21 16:26:19
【问题描述】:
假设您有两个(或更多)numpyndarrays 或等于 size(意味着它们具有相同数量的元素),例如:
A = np.array([[1],[2],[3]]) #Define a 3-element column vector
B = np.array([1,2,3]) #Define a 3-element row vector
鉴于 numpy 的文档将 * 和 / 运算符宣传为两个 ndarray 类型之间的“元素方式”,为什么要执行以下操作:
AtimesB = A*B
AoverB = A/B
返回:
array([[1, 2, 3],
[2, 4, 6],
[3, 6, 9]]) #AtimesB
array([[1. , 0.5 , 0.33333333],
[2. , 1. , 0.66666667],
[3. , 1.5 , 1. ]]) #AoverB
代替:
array([1,4,9])
array([1,1,1])
据我所知,@ 运算符用于进行矩阵乘法,np.divide 处理矩阵除法。我在这里想念什么?这是numpy 处理数组shapes 歧义的方式吗?
【问题讨论】:
-
numpy 没有行(列)向量的概念。一维数组表示线性代数中的行向量和列向量。在您的情况下,您的“列向量”是 2d,“行向量”是 1d。由于numpy broadcasting,
*和/给出矩阵运算。 -
我认为这个操作的技术术语是两个向量的“外积”。也可以使用
np.outer完成。昨天有人在this answer 中解释了广播的工作原理。 -
shape提供的信息比size多。element-wise操作不仅仅是元素的数量。一个数组是 (3,1) 形状,另一个是 (3,)。对于广播目的,(3,) 等价于 (1,3)。一起得到一个 (3,3),一个“外部”操作。