2017-02-04 63 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 - 否則你會回過頭來問問題。