数组操作等效Python和Matlab

时间:2012-01-11 14:33:47

标签: python arrays matlab numpy

我想在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循环和数组操作中进行编码。如果你能提供帮助。 (zeta来自前面的代码)

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 个答案:

答案 0 :(得分:6)

import numpy as np

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

答案 1 :(得分:3)

尝试使用明确的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 :(得分:3)

将代码翻译为python

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

答案 3 :(得分:3)

为了确保一切都被触及,当你使用Matlab时,你应该总是 vectorize,而这在初始代码中没有完成。因此,我建议:

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)

在这两种情况下, no 都需要预先分配。

编辑后的补充: 所以我认为第一个块中仍然存在一些错误。你有:

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版本,numpy版本也自然地遵循:

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))

我想澄清一点,这是你在第二部分刺入第一部分之前想要的。

答案 4 :(得分:2)

使用numpy,就像使用matlab或类似语言一样,当你可以使用基于数组的操作时,你实际上不希望使用循环而不是标记:

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

如果你真的想要遍历指标,你可以这样做:

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)