用MatLab求和函数实现PYTHON对话

t3irkdon  于 2022-11-15  发布在  Matlab
关注(0)|答案(2)|浏览(151)

我正在尝试将这段MatLab代码转换为Python:

#T2 = (sum((log(X(1:m,:)))'));

以下是我用python编写的代码:

T2 = sum(np.log(X[0:int(m),:]).T)

其中m = 103X是矩阵:

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)。我试着在得到和后使用转置,但它不起作用。有什么建议可以得到我想要的尺寸吗?

4ioopgfo

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),你不需要转置,因为你可以在第二个轴上求和。

import numpy as np

X = np.random.rand(216,103)
m = 103
T2 = np.sum(np.log(X[:m]), axis=1).reshape(1,-1)
T2.shape
# (1, 103)
zkure5ic

zkure5ic2#

让我们制作一个演示二维阵列:

In [19]: x = np.arange(12).reshape(3,4)
In [20]: x
Out[20]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

并应用基本的Pythonsum函数(与numpy's自己的函数不同):

In [21]: sum(x)
Out[21]: array([12, 15, 18, 21])

结果是一个(4,)形状数组(不是4x1)。如果你不相信我,请打印sum(x).shape
如果没有给定轴,则numpy.sum函数将所有项相加:

In [22]: np.sum(x)
Out[22]: 66

或使用AXIS:

In [23]: np.sum(x, axis=0)
Out[23]: array([12, 15, 18, 21])
In [24]: np.sum(x, axis=1)
Out[24]: array([ 6, 22, 38])

Pythonsumx视为数组列表,并将它们相加

In [25]: list(x)
Out[25]: [array([0, 1, 2, 3]), array([4, 5, 6, 7]), array([ 8,  9, 10, 11])]

In [28]: x[0]+x[1]+x[2]
Out[28]: array([12, 15, 18, 21])

转置,不带参数,交换轴。它不会添加任何尺寸:

In [29]: x.T          # (4,3) shape
Out[29]: 
array([[ 0,  4,  8],
       [ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11]])
In [30]: sum(x).T
Out[30]: array([12, 15, 18, 21])    # still (4,) shape

八度音阶

>> x=reshape(0:11,4,3)'
x =

    0    1    2    3
    4    5    6    7
    8    9   10   11

>> sum(x)
ans =

   12   15   18   21

>> sum(x,1)
ans =

   12   15   18   21

>> sum(x,2)
ans =

    6
   22
   38

编辑

np.sum函数有一个keepdims参数:

In [32]: np.sum(x, axis=0, keepdims=True)
Out[32]: array([[12, 15, 18, 21]])             # (1,4) shape
In [33]: np.sum(x, axis=1, keepdims=True)
Out[33]: 
array([[ 6],                          # (3,1) shape
       [22],
       [38]])

如果我将数组重塑为3D,并求和,则结果是2D-除非我保持尺寸:

In [34]: np.sum(x.reshape(3,2,2), axis=0).shape
Out[34]: (2, 2)
In [36]: np.sum(x.reshape(3,2,2), axis=0,keepdims=True).shape
Out[36]: (1, 2, 2)

另一方面,MatLab/Octave在默认情况下保持暗度:

sum(reshape(x,3,2,2))         # (1,2,2)

除非我把最后一个,第三个加起来:

sum(reshape(x,3,2,2),3)       # (3,2)

关键是,MatLab的一切都是2D的,可以选择额外的拖尾维度,但处理方式不同。在numpy中,从0开始的每个维度都是以相同的方式处理的。

相关问题