我对python和numpy基本上还不熟悉。我读了几本教程,仍然对dim、rands、shape、aix和dimensions之间的差异感到困惑。我的思想似乎被矩阵表示法所束缚。所以如果你说A是一个矩阵,它看起来是这样的:
A =
1 2 3
4 5 6
我能想到的就是一个2x3矩阵(两行三列)。我知道这里的形状是2x3。但我真的不能不去想二维矩阵。我不明白例如dot() documentation当它说“对于N维,它是a的最后一个轴和b的第二个轴的和积”。我很困惑,无法理解。我不明白V是N:1向量,M是N:N矩阵,点(V,M)或点(M,V)是如何工作的,以及它们之间的区别。
那么有谁能给我解释一下什么是N维数组,什么是形状,什么是轴,它和dot()函数的文档有什么关系?如果解释能使这些想法形象化,那就太好了。
NumPy数组的维数必须用data structures sense来理解,而不是数学意义上的维数,也就是说,它是获取标量值所需的标量索引的数量。(*)
例如,这是一个三维数组:
索引一次可生成二维数组(矩阵):
索引两次给出一维数组(矢量),索引三次给出标量。
X
的秩是它的维数:Axis大致等同于dimension;它用于广播操作:
老实说,我觉得这个“rank”的定义很混乱,因为它既不匹配属性名
ndim
,也不匹配属性名linear algebra definition of rank。现在关于
np.dot
,您需要了解的是,有三种方法可以表示NumPy中的向量:一维数组、形状为(n, 1)
的列向量或形状为(1, n)
的行向量。(实际上,有更多的方法,例如作为一个(1, n, 1)
形状的数组,但这些方法非常少见。)np.dot
当两个参数都是1-d时执行向量乘法,当一个参数是1-d而另一个参数是2-d时执行矩阵向量乘法,否则执行(广义)矩阵乘法:规则“在
a
的最后一个轴上和b
的第二个轴上的和积”匹配并推广了矩阵乘法的一般定义。(*)数组
dtype=object
有点异常,因为它们将任何Python对象视为标量。NumPy数组的维数必须在data structures sense中理解,而不是数学意义上的维数,也就是说,它是获得标量值所需的标量索引的数量。(*)
例如,这是一个三维数组:
索引一次可生成二维数组(矩阵):
索引两次给出一维数组(矢量),索引三次给出标量。
X
的秩是它的维数:Axis大致等同于dimension;它用于广播操作:
老实说,我觉得这个“rank”的定义很混乱,因为它既不匹配属性名
ndim
,也不匹配属性名linear algebra definition of rank。现在关于
np.dot
,您需要了解的是,有三种方法可以表示NumPy中的向量:一维数组、形状为(n, 1)
的列向量或形状为(1, n)
的行向量。(实际上,有更多的方法,例如作为(1, n, 1)
形状的数组,但这些方法非常少见。)np.dot
当两个参数都是1-d时执行向量乘法,当一个参数是1-d而另一个参数是2-d时执行矩阵向量乘法,否则执行(广义)矩阵乘法:规则“在
a
的最后一个轴上和b
的第二个轴上的和积”匹配并推广了矩阵乘法的一般定义。(*)数组
dtype=object
有点异常,因为它们将任何Python对象视为标量。对你来说
A
是二维数组,即矩阵,其形状为(2,3)。来自numpy.matrix
的docstring:numpy.rank
返回数组的维数的数目,这与rank in linear algebra的概念有很大不同,例如A
是维数/秩2的数组。np.dot(V, M)
,或V.dot(M)
将矩阵V
与M
相乘。注意numpy.dot尽可能地进行乘法运算。如果V为N:1,M为N:N,则V.dot(M)
将引发ValueError
。例如:
编辑:
我不明白(N,)和(N,1)的形状之间的区别,它与dot()文档有关。
形状(N,)的
V
表示长度为N的1D数组,而形状(N,1)表示具有N行1列的2D数组:正如
np.dot
的docstring所说:如果其中一个参数是向量,它还执行向量矩阵乘法。说
V.shape==(2,); M.shape==(2,2)
:对你来说
A
是二维数组,即矩阵,其形状为(2,3)。来自numpy.matrix
的docstring:numpy.rank
返回数组的维数的数目,这与rank in linear algebra的概念有很大不同,例如A
是维数/秩2的数组。np.dot(V, M)
,或V.dot(M)
将矩阵V
与M
相乘。注意numpy.dot尽可能地进行乘法运算。如果V为N:1,M为N:N,则V.dot(M)
将引发ValueError
。例如:
编辑:
我不理解(N,)和(N,1)的形状之间的区别,它与dot()文档有关。
形状(N,)的
V
表示长度为N的1D数组,而形状(N,1)表示具有N行1列的2D数组:正如
np.dot
的docstring所说:如果其中一个参数是向量,它还执行向量矩阵乘法。说
V.shape==(2,); M.shape==(2,2)
:np.dot
是矩阵乘法的推广。 在正则矩阵乘法中,(N,M)形矩阵与(M,P)形矩阵相乘得到(N,P)形矩阵。合成的形状可以认为是通过将两个形状挤压在一起((N,M,M,P)
),然后去掉中间的数字M
(产生(N,P)
)而形成的。这是np.dot
在泛化到高维数组时保留的属性。当医生说
这正说明了这一点。一个以形状数组
(u,v,M)
点缀的形状数组(w,x,y,M,z)
将产生一个形状数组(u,v,w,x,y,z)
。让我们看看这个规则应用于
首先,简单的部分:
这并不奇怪,这只是矩阵向量乘法。
现在考虑一下
看V和M的形状:
所以
np.dot(V,M)
就像是(2,)-形矩阵与(2,2)形矩阵的矩阵乘法,应该得到(2,)-形矩阵。将
V
的最后一个轴(也是唯一的)和M
的第二个到最后一个轴(也称为M
的第一个轴)相乘和相加,只留下M
的最后一个轴。如果您想可视化这个:
np.dot(V, M)
看起来V有1行2列:所以,当V乘以M时,
np.dot(V, M)
等于然而,我并不建议尝试以这种方式可视化NumPy数组——至少我从来没有这样做过。我几乎只关注形状。
你只需想想“中间”轴被点着,然后从结果形状中消失。
np.sum(arr, axis=0)
告诉NumPy对第0轴中的元素进行求和。如果arr
是二维的,则第0个轴是行。例如,如果arr
看起来像这样:然后
np.sum(arr, axis=0)
将沿着列求和,从而消除第0个轴(即行)。3是0+3的结果,5等于1+4,7等于2+5。
注意
arr
有形状(2,3),求和后,第0轴被移除,因此结果是形状(3,)。第0轴的长度为2,每个和由添加这2个元素组成。形状(2,3)“变成”(3,)。你可以提前知道结果形状!这有助于引导你的思维。要测试您的理解,请考虑
np.sum(arr, axis=1)
。现在1轴被移除。因此结果形状将是(2,)
,结果中的元素将是3个值的和。3等于0+1+2,12等于3+4+5。
所以我们看到对一个轴进行求和可以从结果中消除这个轴。这与
np.dot
有关,因为np.dot
执行的计算是产品的和之和。由于np.dot
沿某些轴执行求和操作,因此将从结果中删除该轴。这就是为什么将np.dot
应用于形状(2,)和(2,2)的数组会产生形状(2,)的数组的原因。两个数组中的前2个相加,消除了这两个数组,只剩下第二个数组中的第二个2。np.dot
是矩阵乘法的推广。 在正则矩阵乘法中,(N,M)形矩阵与(M,P)形矩阵相乘得到(N,P)形矩阵。合成的形状可以认为是通过将两个形状挤压在一起((N,M,M,P)
),然后去掉中间的数字M
(产生(N,P)
)而形成的。这是np.dot
在泛化到高维数组时保留的属性。当医生说
这正说明了这一点。一个以形状数组
(u,v,M)
点缀的形状数组(w,x,y,M,z)
将产生一个形状数组(u,v,w,x,y,z)
。让我们看看这个规则应用于
首先,简单的部分:
这并不奇怪,这只是矩阵向量乘法。
现在考虑一下
看V和M的形状:
所以
np.dot(V,M)
就像是(2,)-形矩阵与(2,2)形矩阵的矩阵乘法,结果应该是(2,)-形矩阵。将
V
的最后(也是唯一)轴和M
的第二个到最后一个轴(也称为M
的第一个轴)相乘和相加,只留下M
的最后一个轴。如果您想可视化这个:
np.dot(V, M)
看起来V有1行2列:所以,当V乘以M时,
np.dot(V, M)
等于然而,我并不建议尝试以这种方式可视化NumPy数组——至少我从来没有这样做过。我几乎只关注形状。
你只需想想“中间”轴被点着,然后从结果形状中消失。
np.sum(arr, axis=0)
告诉NumPy对第0轴中的元素进行求和。如果arr
是二维的,则第0个轴是行。例如,如果arr
看起来像这样:然后
np.sum(arr, axis=0)
将沿着列求和,从而消除第0个轴(即行)。3是0+3的结果,5等于1+4,7等于2+5。
注意
arr
有形状(2,3),求和后,第0轴被移除,因此结果是形状(3,)。第0轴的长度为2,每个和由添加这2个元素组成。形状(2,3)“变成”(3,)。你可以提前知道结果形状!这有助于引导你的思维。要测试您的理解,请考虑
np.sum(arr, axis=1)
。现在1轴被移除。结果的形状是(2,)
,结果中的元素是3个值的和。3等于0+1+2,12等于3+4+5。
所以我们看到对一个轴进行求和可以从结果中消除这个轴。这与
np.dot
有关,因为np.dot
执行的计算是产品的和之和。由于np.dot
沿某些轴执行求和操作,因此将从结果中删除该轴。这就是为什么对形状(2,)和(2,2)的数组应用np.dot
会得到形状(2,)的数组。两个数组中的前2个相加,消除了这两个数组,只剩下第二个数组中的第二个2。相关问题 更多 >
编程相关推荐