Matlab到Python numpy索引和乘法问题

Gar*_*ary 3 python matlab numpy

我在MATLAB中有以下代码行,我试图转换为Python numpy:

pred = traindata(:,2:257)*beta;
Run Code Online (Sandbox Code Playgroud)

在Python中,我有:

pred = traindata[ : , 1:257]*beta
Run Code Online (Sandbox Code Playgroud)

beta 是一个256 x 1阵列.

在MATLAB中,

size(pred) = 1389 x 1
Run Code Online (Sandbox Code Playgroud)

但在Python中,

pred.shape = (1389L, 256L)
Run Code Online (Sandbox Code Playgroud)

所以,我发现乘以beta数组会产生两个数组之间的差异.

我如何编写原始的Python行,因此大小pred为1389 x 1,就像在MATLAB中乘以我的beta数组一样?

ray*_*ica 8

我怀疑这beta实际上是一维numpy数组.在numpy,1D数组不是行或列向量,其中MATLAB明确区分.这些只是一维阵列与任何形状无关.如果必须,您需要手动向beta向量引入新的单例维度以便于乘法.除此之外,*运算符实际上执行逐元素乘法.要执行矩阵向量或矩阵的矩阵乘法,你必须使用numpydot函数来进行.

因此,你必须做这样的事情:

import numpy as np # Just in case

pred = np.dot(traindata[:, 1:257], beta[:,None])
Run Code Online (Sandbox Code Playgroud)

beta[:,None]将创建一个2D numpy数组,其中沿着行填充来自1D数组的元素,有效地形成列向量(即256 x 1).但是,如果您已经这样做了beta,那么您不需要引入新的单例维度.只需dot正常使用:

pred = np.dot(traindata[:, 1:257], beta)
Run Code Online (Sandbox Code Playgroud)

  • @Nick如果你只是想找到两个`numpy`数组的点积,那么我所说的这些单例内容都不是必需的.只是做`np.dot(traindata,beta)`假设它们都是相同大小的一维数组.只需使用`dot`.对于1D阵列,这将执行两个阵列之间的点积,但它在两个矩阵/向量之间执行矩阵向量乘法或矩阵 - 矩阵乘法.无论如何,矩阵向量或矩阵 - 矩阵乘法归结为一系列点积计算,这就是为什么`dot`有它的名字. (3认同)
  • @Nick它只是`traindata = traindata [:,None]`.第二个参数中的"None"允许您创建一个包含两个维度的数组,而不是您自己明确创建第二个维度的数组.然后,它将按行逐行填充2D矩阵.一般来说,这适用于任何`numpy`数组,如果你有'N`维,你会创建一个'N + 1`维数组,最后一个维度的大小为1.`(1389L,)`表示`traindata`是一维数组.如果要执行矩阵乘法,则需要包含单例维度. (2认同)