我正在尝试将这段MatLab代码转换为Python:
#T2 = (sum((log(X(1:m,:)))'));
以下是我用python编写的代码:
T2 = sum(np.log(X[0:int(m),:]).T)
其中m = 103
和X
是矩阵:
f1 = np.float64(135)
f2 = np.float64(351)
X = np.float64(p[:, int(f1):int(f2)])
p
是字典(加载数据)
问题是,在对(np.log(X[0:int(m), :]).T
)应用sum函数之前,与matlab一样,在相同维度(216x103
)下,python给出了完全相同的值。然而。在应用SUM函数之后,它给出了正确的值,但给出了错误的维度(103x1
)。正确的尺寸为(1x103
)。我试着在得到和后使用转置,但它不起作用。有什么建议可以得到我想要的尺寸吗?
2条答案
按热度按时间4ioopgfo1#
Matlab中的矩阵由
m
行和n
列组成,而NumPy中的矩阵是由数组组成的数组。每个子阵列是具有等于其元素n
的数目的1维的平面向量。MatLab没有平面向量,一行是1xn
矩阵,一列是mx1
矩阵,标量是1x1
矩阵。回到这个问题,当你用Python语言编写
T2 = sum(np.log(X[0:int(m),:]).T)
时,它既不是103x1
,也不是1x103
,它是一个平面的103
向量。如果你特别想要一个像matlab一样的1x103
矩阵,只需要reshape(1,-1)
,你不需要转置,因为你可以在第二个轴上求和。zkure5ic2#
让我们制作一个演示二维阵列:
并应用基本的Python
sum
函数(与numpy's
自己的函数不同):结果是一个(4,)形状数组(不是4x1)。如果你不相信我,请打印
sum(x).shape
。如果没有给定轴,则
numpy.sum
函数将所有项相加:或使用AXIS:
Python
sum
将x
视为数组列表,并将它们相加转置,不带参数,交换轴。它不会添加任何尺寸:
八度音阶
编辑
np.sum
函数有一个keepdims
参数:如果我将数组重塑为3D,并求和,则结果是2D-除非我保持尺寸:
另一方面,MatLab/Octave在默认情况下保持暗度:
除非我把最后一个,第三个加起来:
关键是,MatLab的一切都是2D的,可以选择额外的拖尾维度,但处理方式不同。在
numpy
中,从0开始的每个维度都是以相同的方式处理的。