Matlab到Python的numpy索引和乘法问题
我在MATLAB中有下面一行代码,我正在尝试将其转换为PythonMatlab到Python的numpy索引和乘法问题,python,matlab,numpy,Python,Matlab,Numpy,我在MATLAB中有下面一行代码,我正在尝试将其转换为Pythonnumpy: pred = traindata(:,2:257)*beta; 在Python中,我有: pred = traindata[ : , 1:257]*beta beta是一个256 x 1的阵列 在MATLAB中 size(pred) = 1389 x 1 但在Python中 pred.shape = (1389L, 256L) 因此,我发现乘以beta数组会产生两个数组之间的差异 如何编写原始Python行,
numpy
:
pred = traindata(:,2:257)*beta;
在Python中,我有:
pred = traindata[ : , 1:257]*beta
beta
是一个256 x 1的阵列
在MATLAB中
size(pred) = 1389 x 1
但在Python中
pred.shape = (1389L, 256L)
因此,我发现乘以beta
数组会产生两个数组之间的差异
如何编写原始Python行,使
pred
的大小为1389 x 1,就像在MATLAB中乘以beta数组一样?我怀疑beta
实际上是1Dnumpy
数组。在numpy
中,1D数组不是行向量或列向量,而MATLAB对此做了明确区分。这些只是不可知任何形状的一维阵列。如果必须,则需要手动将新的单例维度引入beta
向量,以便于乘法。除此之外,*
运算符实际执行元素级的乘法。要执行矩阵向量或矩阵乘法,必须使用numpy
的函数
因此,您必须这样做:
import numpy as np # Just in case
pred = np.dot(traindata[:, 1:257], beta[:,None])
beta[:,None]
将创建一个2Dnumpy
数组,其中1D数组中的元素沿行填充,有效地形成一个列向量(即256 x 1)。但是,如果您已经在beta
上这样做了,那么您就不需要引入新的单例维度。正常使用dot
:
pred = np.dot(traindata[:, 1:257], beta)
这个解决方案解决了我的问题。通过使用您提供的第一行代码,我的数组现在在Python中是1389 x 1。谢谢@尼克,没问题!很高兴我能帮忙。祝你好运@尼克,这只是
traindata=traindata[:,无]
。第二个参数中的None
允许您创建两个维度的数组,而不是您自己显式创建第二个维度的数组。然后,它将用元素行方式填充2D矩阵。一般来说,这适用于任何numpy
数组,如果您有N
维度,您将创建一个N+1
维度数组,最后一个维度的大小为1。(1389L,)
表示traindata
是一个1D数组。如果您想执行矩阵乘法,则需要包含单体维度。@Nick如果您只想查找两个numpy
数组的点积,则不需要我所说的单体元素。只要做np.dot(traindata,beta)
就可以了,假设它们都是相同大小的1D数组。只需单独使用dot
。对于1D阵列,它在两个阵列之间执行点积,但在两个矩阵/向量之间执行矩阵向量乘法或矩阵矩阵乘法。矩阵向量或矩阵乘法归结为一系列点积计算,这就是为什么dot
有它的名字。还要注意,对于python 3.5或更高版本,您可以用a@b
替换np.dot(a,b)
。@
运算符的矩阵乘法操作与MATLAB*
运算符类似(而*
运算符的行为与MATLAB*
运算符类似)。