python中的numpy.sum()和matlab中的sum()在输出上的区别。

问题描述 投票:-1回答:1

我正在将MATLAB代码转换为Python。

这是我在python中的代码。

import numpy as np
import math

n=150
L=1
inter=L/n
y=np.linspace(inter/2,L-inter/2,n).transpose()
E=(210000000000)*np.ones(n)
Rho=7800*np.ones(n)
PI=math.pi
A=np.exp( 5+2*y*(np.sin(2*PI*y/L)) )*0.000001

在这之前都很好,没有任何数值上的差异,也没有任何问题 直到我不得不执行这段MATLAB代码。

Mass=sum(Rho*inter.*A)

我试着用 np.sum(Rho*inter*A) 而只是 Rho*inter*A

第一个案例我得到了一个答案 1.0626206716847877 但MATLAB返回一个150元素的数组。

在scond的情况下,我得到了一个 ndarray 像我想要的,但值是不一样的,我在MATLAB中得到的。

我在MATLAB中得到的值。matlab的值粘贴栏

我在python中得到的值。python values pastebin

我做错了什么?

python matlab numpy math
1个回答
1
投票
(Rho[:,None]*inter*A).sum(axis=0) 

匹配你的MATLAB pastebin。

或者使用 einsum 来整理轴。

np.einsum('i,j->j', Rho,inter*A)

这只是减少。

Rho.sum() * inter*A

这真的是你在MATLAB里要做的事情吗?

如果您展示一下用于创建的实际MATLAB代码,可能会有所帮助 Rho, A 等。

Mass=sum(Rho*inter.*A)

规模有多大 RhoA 在MATLAB中? 一个可能是[1x150],但另一个? 是 Rho 也有[1x150],或[150x150]。 〔150x150〕。* 是矩阵乘法,就像 @ 在numpy中,但 .* 是元素方面。

numpy 编码 y, RhoA 都有形状(150,)。 上的转置。y 什么也不做。 Rho*inter*A 是元素乘法,也会产生一个(150,)。


1
投票

NumPy总是对一个矩阵的所有元素进行求和。MATLAB的默认值是基于列的,也就是说,所有150个列的总和是一个单一的总和,因此是数组。使用 sum(matrix,'all'); 在MATLAB中,对矩阵中的所有元素进行求和。如果您的MATLAB比2018b老,请使用 sum(matrix(:))即把你的矩阵存储在一个临时变量中,然后在求和之前把它压平为一列。

在Python中,如果要在列上求和,请指定轴,是0。np.sum(matrix,axis=0)

numpy.sum():

轴:进行求和的轴。默认情况下,axis=None,将对输入数组的所有元素进行求和。

sum() 从MATLAB中获得。

S = sum(A) 返回MATLAB中元素的和。A 的第一个数组维度,其大小不等于 1. 如果 A 是一个矩阵,那么 sum(A) 返回一个包含各列之和的行向量。 S = sum(A,'all') 计算所有元素的和。A. 此语法对MATLAB® R2018b及以后的版本有效。

为了防止这种不清晰的情况发生,我喜欢总是指定在哪个方向上求和,即 sum(matrix,1) 对于MATLAB和 np.sum(matrix,axis=0) 的NumPy,不管默认情况如何。


-1
投票

我认为在MATLAB中使用 sum 在一个矩阵上,你将得到它的各个列的总和,最终你将得到一个元素数等于列数的数组。再用一个 sum 在MATLAB中的命令。sum(sum(M)),这相当于 np.sum(M) 在Python中。

© www.soinside.com 2019 - 2024. All rights reserved.