2014-04-16 170 views
1

我有以下問題。我在課堂上保存了大量的數據。這些數據大部分都是時間依賴的,在最複雜的情​​況下,變量是三維數組。因爲列表非常靈活(不需要顯式聲明),我想用它們來封裝我的N維數組,因此使用列表來保持時間依賴信息。提取Python中列表中的N維數組的元素

這裏什麼我對元件T = 0的典型例子,T = 2和t我的列表= 3它是歷史類中(float64的簡單矩陣):

history.params[0] 
array([[ 1.  , 2.  , 1.  ], 
     [ 1.  , 2.  , 1.  ], 
     [ 0.04877093, 0.53176887, 0.26210472], 
     [ 2.76110434, 1.3569246 , 3.118208 ]]) 

history.params[2] 
array([[ 1.00000825, 1.99998362, 1.00012835], 
     [ 0.62113657, 0.47057772, 5.23074169], 
     [ 0.04877193, 0.53076887, 0.26210472], 
     [ 0.02762192, 4.99387138, 2.6654337 ]]) 
history.params[3] 
array([[ 1.00005473, 1.99923187, 1.00008009], 
     [ 0.62713657, 0.47157772, 5.23074169], 
     [ 0.04677193, 0.53476887, 0.25210472], 
     [ 0.02462192, 4.89387138, 2.6654337 ]]) 

現在,我該如何讀取/提取矩陣中給定座標(x,y)處的所有元素,以獲得所有時間索引t?

我試着這樣做:

history.params[:][0][0] 

,我得到

array([ 1., 2., 1.]) 

其實無論結腸的地方,我總是得到相同的值,對應於我的矩陣的第一行:

"history.params[0][:][0]" returns "array([ 1., 2., 1.])" in the shell 

"history.params[0][0][:]" returns "array([ 1., 2., 1.])" 

爲什麼Python不能在這裏區分矩陣元素從t他列表中的元素?什麼是最好的解決方案?

當然,我可以編寫一些循環並創建一個新的變量來重新組織我的數據,但這有點浪費能量。我確信它存在一個優雅的解決方案。 PS:我要在某些時候'Cythonize'我的代碼,所以如果你有一個優化的用於存儲這些變量的Cython的解決方案,我很高興聽到它。

+0

謝謝你的建議。我保留了時間依賴列表,因爲它更容易實現:我不需要指定時間變量的初始大小。受到你的評論的啓發,我選擇了一個顯式聲明的N維的數組(使用np.zeros()),其大小足夠大。索引不是問題,但變量可能需要比需要更多的空間...現在內存很便宜。 – tomahna

回答

2

我建議使用numpy.array數組而不是嵌套列表。

import numpy as np 

# Create some data which would be equal to your "params" 
a = np.array([[[1, 2, 3], 
       [4, 5, 6], 
       [7, 8, 9]], 
       [[11, 12, 13], 
       [14, 15, 16], 
       [17, 18, 19]]]) 

print(a[0]) 
# [[1 2 3] 
# [4 5 6] 
# [7 8 9]] 

print(a[:, 0, 0]) 
# [1, 11] 

print(a[:, 0:2, 0]) 
# [[1, 4] 
# [11, 14]] 

此外,numpy可以與Cython結合爲給定的here

0

爲什麼Python在這裏無法區分矩陣元素與列表元素?什麼是最好的解決方案?

由於history.params[0]是一個列表的列表,所以history.params[0][0]是一個列表,所以history.params[0][0][:]list[:],其是內部列表的副本。同樣,history.params[0][:]是列表的副本,所以history.params[0][:][0](copy of the list of lists)[0],它也是您的內部列表的第一行,但是在2D數組的副本中。

如果要彙整清單,即存儲二維數組作爲一個列表,在大小的二維數組的(n,m)NxM成爲你的扁平數組元素(n*M + m)每個元素。因此,在您發佈的4x3中,元素(0,0)是扁平列表的元素0,元素(2,1)是元素2 * 3 + 1 = 7,依此類推。

您可以將其擴展到3D陣列:大小爲KxNxM的數組,您應該有索引(k,n,m)是元素(k*N*M + n*N + m);對於更高的維度也是如此。

相關問題