Операция Array, эквивалентная Python и Matlab - PullRequest
2 голосов
/ 11 января 2012

Я хочу написать в Python эквивалент этого кода в Matlab,

   zeta = zeros(1,5)
   alpha=[1e5,1e3,1e5,1e7,1e3];
   dz = 0.001;
   for i=1:length(zeta)
       zeta(i) = alpha(i)/(dz*dz);
   end

РЕДАКТИРОВАТЬ: Спасибо за все ответы, они все очень полезны и помогают понять, как работает Python, и кажется, Matlab;потому что я не получаю полный потенциал работы с массивами и матрицами.Мой начальный язык программирования - C.

Теперь я пытаюсь понять, как кодировать в циклах Python и операциях с массивами.Если вы можете помочь.(дзета из предыдущего кода)

nl= 7;
l=[0.3,0.1,0.2,0.1,0.1,0.1,0.3)   
wz=zeros(1,nl);         %layer width
temp=0;                 %auxiliary temp variable

for i=1:nl
    wz(i)=l(1,i)*(nz-1)+temp;
    temp=wz(1,i);
end

Ответы [ 5 ]

6 голосов
/ 11 января 2012
import numpy as np

alpha = np.array([1e5, 1e3, 1e5, 1e7, 1e3])
dz = 0.001
zeta = alpha / dz**2
3 голосов
/ 11 января 2012

Просто чтобы убедиться, что все затронуто, когда вы используете Matlab, вы должны всегда векторизовать, а это не было сделано в исходном коде.Поэтому я бы порекомендовал:

zeta = zeros(1,5)
alpha=[1e5,1e3,1e5,1e7,1e3];
dz = 0.001;
for i=1:length(zeta)
    zeta(i) = alpha(i)/(dz*dz);
end

На самом деле записать как:

alpha = [1e5,1e3,1e5,1e7,1e3];
dz = 0.001;
zeta = alpha/dz^2;

Тогда код, который вы пишете в numpy, гораздо более естественным образом следует из того, что вы написали в Matlabи аналогично использует векторизацию.

import numpy
alpha = numpy.array([1e5,1e3,1e5,1e7,1e3])
dz = 0.001
zeta = alpha/(dz*dz)

В обоих случаях нет необходимости предварительно выделять.

ДОБАВЛЕНИЕ ПОСЛЕ РЕДАКТИРОВАНИЯ: Так что я думаю, что в первом блоке все еще есть некоторые ошибки.У вас было:

nl= 7;
l=[0.3,0.1,0.2,0.1,0.1,0.1,0.3)   
wz=zeros(1,nl);         %layer width
temp=0;                 %auxiliary temp variable

for i=1:nl
  wz(i)=l(1,i)*(nz-1)+temp;
  temp=wz(1,i);
end

Вы никогда не определили nz, поэтому я предполагаю, что вы имели в виду скаляр nl, который (я думаю) должен быть длиной l (или это было просто совпадение?).Просто для первой части, я предполагаю, что это то, что вы хотели бы сделать:

l=[0.3,0.1,0.2,0.1,0.1,0.1,0.3];
nl = length(l);
wz = cumsum(l*(nl-1));

Это, конечно, версия Matlab, и естественная версия также следует естественным образом, где:

l = numpy.array([0.3,0.1,0.2,0.1,0.1,0.1,0.3])
n1 = len(l)
wz = numpy.cumsum(l*(n1-1))

Я хотел бы уточнить, что это было то, что вы хотели в первой части, прежде чем я сделаю удар во второй.

3 голосов
/ 11 января 2012

Переведите ваш код на python:

alpha = [1e5,1e3,1e5,1e7,1e3]
dz = 0.001
zeta = [i/(dz**2) for i in alpha]
3 голосов
/ 11 января 2012

Попробуйте, используя явный цикл for:

zeta  = [0] * 5
alpha = [1e5, 1e3, 1e5, 1e7, 1e3]
dz    = 0.001
for i in range(len(zeta)):
    zeta[i] = alpha[i] / (dz*dz)

Или это, используя списки (это должно быть быстрее):

alpha = [1e5, 1e3, 1e5, 1e7, 1e3]
dz    = 0.001
zeta  = [a/(dz*dz) for a in alpha]

Обратите внимание,Я не использую NumPy, просто чистый Python.

2 голосов
/ 11 января 2012

В numpy, как в случае с matlab или аналогичными языками, вы фактически не хотите использовать циклы над показателями, когда вы можете использовать операции на основе массива, которые быстрее и понятнее:действительно хотел бы перебрать индикаторы, вы бы сделали это:

import numpy
zeta = numpy.zeros((1,5))
alpha = numpy.array([1e5,1e3,1e5,1e7,1e3])
dz = 0.001
for i in xrange(alpha.size):
...     zeta[0,i] = alpha[i]/(dz*dz)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...