2017-02-04 66 views
0

我是一个MATLAB用户。 什么是端口的最简单方法如下MATLAB脚本到Python奋斗与动态ndarray

a = [] 
for i=1:10 
    for j=1:10 
     a(i,j) = i*j 
    end 
end 

问题是关于动态地使用np.ndarrays。在MATLAB中,我可以在不知道其大小的情况下将其初始化为一般的ndarray(通过a = []),然后使用显式索引a(i,j)。 在Python中有.append方法,但是当使用ndarrays时会让我困惑,因为它需要首先打包行的元素,然后将行打包到一起,或者类似的东西。我宁愿明确索引。这是可能用动态数组加密还是只能用固定大小的数组完成?

谢谢!

+0

对于循环和动态分配是一种不好的做法,在Matlab中和Python一样。 – UpSampler

+0

如果你必须像这样迭代,以'a = np.zeros((10,10),dtype = int)'开头。 – hpaulj

+0

MATLAB的数组实际上并不是动态的。像numpy数组一样,如果不创建新数组并且复制所有数据,就不能调整MATLAB数组的大小。这只是假装当numpy没有调整它们的大小时。 – TheBlackCat

回答

2

看着显示器在运行MATLAB

a = 1 
a = 
    1 2 
a = 
    1 2 3 
a = 
    1 2 3 4 
.... (so on for 100 iterations) 

在八音我可以这样做:

>> i=1:10 
i = 

    1 2 3 4 5 6 7 8 9 10 

>> j=(1:10)' 
j = 

    1 
    2 
    3 
    4 
    5 
    6 
    7 
    8 
    9 
    10 

>> a=i+j 
a = 

    2 3 4 5 6 7 8 9 10 11 
    3 4 5 6 7 8 9 10 11 12 
    4 5 6 7 8 9 10 11 12 13 
    5 6 7 8 9 10 11 12 13 14 
    6 7 8 9 10 11 12 13 14 15 
    7 8 9 10 11 12 13 14 15 16 
    8 9 10 11 12 13 14 15 16 17 
    9 10 11 12 13 14 15 16 17 18 
    10 11 12 13 14 15 16 17 18 19 
    11 12 13 14 15 16 17 18 19 20 

这使得利用广播,这一概念从numpy的

In [500]: i=np.arange(1,11) 
In [501]: a = i[:,None] + i 
In [502]: a 
Out[502]: 
array([[ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 
     [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 
     [ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 
     [ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], 
     [ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 
     [ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 
     [ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], 
     [ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], 
     [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], 
     [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]]) 

这是最佳实践 - 在numpy中,我敢说MATLAB和Octave。

但是如果你必须使用迭代这样做

In [503]: a=np.zeros((10,10),int) 
In [504]: for i in range(10): 
    ...:  for j in range(10): 
    ...:   a[i,j]=i+j 

具有完全成熟的Python列表进行迭代:

In [512]: alist = [] 
In [513]: for i in range(10): 
    ...:  sublist=[] 
    ...:  for j in range(10): 
    ...:   sublist.append(i+j) 
    ...:  alist.append(sublist) 
    ...:  
In [514]: alist 
Out[514]: 
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14], 
[6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 
[7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 
[8, 9, 10, 11, 12, 13, 14, 15, 16, 17], 
[9, 10, 11, 12, 13, 14, 15, 16, 17, 18]] 
In [515]: np.array(alist) 
Out[515]: 
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
     [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 
     [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 
     [ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 
     [ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], 
     [ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 
     [ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 
     [ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], 
     [ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]]) 

,但我可以生成alist更紧凑与

alist=[[i+j for i in range(10)] for j in range(10)] 

当您建立一个列表清单时,确保所有子列表都具有相同的leng - 否则你会回过头来问问题。