在python库numpy中,是array([2,1])(1,2)还是(2,1)_(row,col)?
我在下面进行了 3 次尝试,但找不到答案。
import numpy as np
x = np.array([1,2])
y = np.array([[1,3,5], [2,4,6]])
z = np.array([[1,2],[3,4],[5,6]])
o = np.array([1,2,3])
print(np.dot(x,y))
print(np.dot(z,x))
print(np.dot(x,o))
第一个和第二个有效,但最后一个没有。错误是:-
ValueError: shapes (2,) and (3,) not aligned: 2 (dim 0) != 3 (dim 0)
在我看来, 在情况 1 中,x =(1 行和 2 列) 在情况 2 中,x =(2 行和 1 列) 在情况 3 中,x 应该是(2 行和 1 列),但它不起作用
请让我知道为什么会发生这种情况。
In [272]: x = np.array([1,2])
...: y = np.array([[1,3,5], [2,4,6]])
...: z = np.array([[1,2],[3,4],[5,6]])
...: o = np.array([1,2,3])
...:
In [273]: x.shape
Out[273]: (2,) # 1 element tuple
In [274]: y.shape
Out[274]: (2, 3) # 2 element tuple
In [275]: z.shape
Out[275]: (3, 2)
In [276]: o.shape
Out[276]: (3,)
维度的行/列解释适合 2 个数组,如y
和z
。 这与x
和o
格格不入.
我们可以从x
制作一个 2d 数组 ,有一个明确的行,2 列:
In [277]: x[None,:].shape
Out[277]: (1, 2)
但出于许多目的,(2,) 形状与 (1,2) 一样有效。
np.dot
有关于如何处理 1D 数组的有据可查的规则。
基本规则是在 A 的最后一个暗角和 B 的第二个到最后一个暗点上执行乘积总和,并允许 1d。
x, y (2,) with (2,3) => (3,) (the 2's pair)
z, x (3,2) with (2,) => (3,) (the 2's pair)
x, o (2,) with (3,) no match!
A (n,2) 将与 (2,3) 点点以产生 (n,3) 结果。 同样,带有 (2,n) 的 (3,2) 产生 (3,n)。
这是学习numpy
时的"黄金"规则:应用形状兼容性规则时,永远不要考虑行和列。
话虽如此,以下是np.dot(a,b)
的形状兼容性规则(此处作为编号项目符号复制)
- 如果 a 和 b 都是一维数组,则它是向量的内积(没有复共轭)。
- 如果 a 和 b 都是二维数组,则它是矩阵乘法,但最好使用 matmul 或 @ b。
如果 a 或 b- 是 0-D(标量),则等效于 乘法,最好使用 numpy.multiply(a, b) 或 a * b。
如果 a 是- N-D 数组,b 是一维数组,则它是 a 和 b 最后一个轴上的和积。
- 如果 a 是 N-D 数组,b 是 M-D 数组(其中 M>=2),则它是 a 的最后一个轴和 b 的倒数第二个轴上的和积
(请注意,没有任何规则是用行和列表示的。它们仅以数组的尺寸表示a
和b
)
在我们的例子中:
x
是一个具有2
元素的一维数组(或"矢量")。
y
是一个形状为(2,3)
的二维数组。
z
是一个形状为(3,2)
的二维数组。
o
是一个包含3
元素的一维数组(或"矢量")。
对于np.dot(x,y)
,规则(5)适用。
对于np.dot(z,x)
,规则(4)适用。
对于np.dot(x,o)
,rule(1) 被尝试,但失败了,因为你不能用另一个3
元素向量做一个2
元素向量的内积。(两个向量需要具有相同数量的元素)
我不确定你的问题是什么,当你有 (X,) X 表示元素数量并且 (X,Y) 是 x 行和 Y 列
x.shape -> (2,) 2 elements
o.shape -> (3,) 3 elements
y.shape -> (2, 3) 2 rows 3 cols
z.shape -> (3, 2) 3 rows 2 cols
所以np.dot(x,o)
会给你一个错误
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<__array_function__ internals>", line 6, in dot
ValueError: shapes (2,) and (3,) not aligned: 2 (dim 0) != 3 (dim 0)