Разница в выходных значениях между numpy .sum () в python и sum () в matlab - PullRequest
1 голос
/ 23 апреля 2020

Я конвертирую код 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.

Значения I получил в MATLAB: значения Matlab pastebin

значения, которые я получил в python: python значения pastebin

Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 23 апреля 2020
(Rho[:,None]*inter*A).sum(axis=0) 

соответствует вашей вставке MATLAB.

Или с помощью einsum для сортировки осей:

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

, которая просто уменьшается до:

Rho.sum() * inter*A

Это действительно то, что вы пытаетесь сделать в MATLAB?

Может помочь, если вы покажете фактический код MATLAB, использованный для создания Rho, A et c.

Mass=sum(Rho*inter.*A)

Каков размер Rho и A в MATLAB? Один может быть [1x150], а другой? Также Rho [1x150] или [150x150]. * - это матричное умножение, как @ в numpy, но .* поэлементно.

В numpy коде y, Rho и A все имеют форму (150,). Транспонирование на y ничего не делает. Rho*inter*A - это поэлементное умножение, производящее также (150,).

1 голос
/ 23 апреля 2020

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) возвращает сумму элементов A по первому измерению массива, размер которого не равен 1.
Если A является матрицей, то sum(A) возвращает вектор строки, содержащий сумму каждого столбца .
S = sum(A,'all') вычисляет сумму всех элементов A. Этот синтаксис действителен для версий MATLAB® R2018b и более поздних версий.

Чтобы избежать такого рода неясностей, я предпочитаю всегда указывать направление суммирования, например sum(matrix,1) для MATLAB и np.sum(matrix,axis=0) для NumPy, независимо от значения по умолчанию.

0 голосов
/ 23 апреля 2020

Я думаю, что в MATLAB с использованием sum на матрице вы получите сумму отдельных столбцов, и у вас получится массив с количеством элементов, равным количеству столбцов. Используйте еще одну команду sum в MATLAB: sum(sum(M)), что эквивалентно np.sum(M) в Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...