2014-03-07 215 views
2

我正在使用Python2.7。什麼是存儲我的2D數據的最佳方式

我有一個2D陣列是這樣的:

[[ 0, 12, 6, -1, -1, -1, -1, -1], 
[57, 69, 68, 67, 75, -1, -1, -1], 
[19, 21, -1, -1, -1, -1, -1, -1], 
[ 1, 18, 19, 11, 5, -1, -1, -1], 
[16, 9, 10, -1, -1, -1, -1, -1], 
[-1, -1, -1, -1, -1, -1, -1, -1], 
[-1, -1, -1, -1, -1, -1, -1, -1], 
[54, 66, 65, -1, -1, -1, -1, -1]] 

-1僅僅是空的節點的標誌。

我需要搜索數組的元素,操縱元素並更新數組數千次。到目前爲止,陣列很小,當尺寸增加到8 * 500時。這種操縱將耗費時間和內存。

以這種方式存儲數組有什麼好處嗎?

[[26, 12, 6], 
[57, 69, 68, 67, 75], 
[19, 21], 
[28, 18, 19, 11, 5], 
[16, 9, 10], 
[54, 66, 65]] 

這樣,在數據操作過程中,我需要做附加或刪除操作。

什麼是最好的方式來存儲我的數據?非常感謝

+0

這是一個不是數組的列表。 –

+0

看看稀疏[矩陣](https://en.wikipedia.org/wiki/Sparse_matrix)。 –

+5

我個人會使用numpy的蒙面數組或熊貓數據框 –

回答

0

也許嘗試使用SciPy的稀疏矩陣。 SciPy: Sparse Matrix您要使用的特定人將取決於您正在進行的計算。

from scipy.sparse import * 
from scipy import * 

row = array([0,0,0,1,1,1,1,1,2,2,3,3,3,3,3,4,4,4,7,7,7]) 
col = array([0,1,2,0,1,2,3,4,0,1,0,1,2,3,4,0,1,2,0,1,2]) 
data = array([0,12,6,57,69,68,67,75,19,21,1,18,19,11,5,16,9,10,54,66,65]) 

M = csr_matrix((data, (row,col)), shape = (8,8)) 

>>> M.todense() 
Out[34]: 
matrix([[ 0, 12, 6, 0, 0, 0, 0, 0], 
     [57, 69, 68, 67, 75, 0, 0, 0], 
     [19, 21, 0, 0, 0, 0, 0, 0], 
     [ 1, 18, 19, 11, 5, 0, 0, 0], 
     [16, 9, 10, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0], 
     [54, 66, 65, 0, 0, 0, 0, 0]]) 

這將佔用內存中較少的空間(對於大型矩陣),並且對行進行分片/迭代很快。 (但它是慢速切片,遍歷列。)

+0

非常感謝。使用M.todense()後,是否可以將空條目更改爲-1,以便它不會與有效數據0衝突? – Shirley

+0

我會寫一對循環。外部循環遍歷行。內循環從結尾**開始遍歷列**並向後工作。當前位置的值等於零時,將其設置爲-1。當它不是零時,跳出內部循環,然後繼續下一行。 – mathdan

6

這是一個numpy masked array或pandas DataFrame的好例子。原因如下:

import numpy as np 
import pandas 

# plain numpy arrays don't know what -1 actually means 
myArr = np.array([ 
[0, 12, 6, -1, -1, -1, -1, -1], 
[57, 69, 68, 67, 75, -1, -1, -1], 
[19, 21, -1, -1, -1, -1, -1, -1], 
[1, 18, 19, 11, 5, -1, -1, -1], 
[16, 9, 10, -1, -1, -1, -1, -1], 
[-1, -1, -1, -1, -1, -1, -1, -1], 
[-1, -1, -1, -1, -1, -1, -1, -1], 
[54, 66, 65, -1, -1, -1, -1, -1] 
]) 
print(myArr.mean(axis=1)) 
[ 1.625 41.625 4.25 6.375 3.75 -1.  -1.  22.5 ] 

# masked arrays do (if you tell them) 
myMArr = np.ma.masked_equal(myArr, -1) 
print(myMArr.mean(axis=1)) 
[6.0 67.2 20.0 10.8 11.666666666666666 -- -- 61.666666666666664] 

# and so do dataframes 
myDF = pandas.DataFrame(myMArr) 
print(myDF.mean(axis=1)) 

0  6.000000 
1 67.200000 
2 20.000000 
3 10.800000 
4 11.666667 
5   NaN 
6   NaN 
7 61.666667 
dtype: float64 

我非常喜歡掩碼數組上的數據幀。最明顯的原因是默認REPRs

屏蔽數組:

masked_array(data = 
[[0 12 6 -- -- -- -- --] 
[57 69 68 67 75 -- -- --] 
[19 21 -- -- -- -- -- --] 
[1 18 19 11 5 -- -- --] 
[16 9 10 -- -- -- -- --] 
[-- -- -- -- -- -- -- --] 
[-- -- -- -- -- -- -- --] 
[54 66 65 -- -- -- -- --]], 
      mask = 
[[False False False True True True True True] 
[False False False False False True True True] 
[False False True True True True True True] 
[False False False False False True True True] 
[False False False True True True True True] 
[ True True True True True True True True] 
[ True True True True True True True True] 
[False False False True True True True True]], 
     fill_value = -1) 

數據框(文字版):

0 1 2 3 4 5 6 7 
0 0 12 6 NaN NaN NaN NaN NaN 
1 57 69 68 67 75 NaN NaN NaN 
2 19 21 NaN NaN NaN NaN NaN NaN 
3 1 18 19 11 5 NaN NaN NaN 
4 16 9 10 NaN NaN NaN NaN NaN 
5 NaN NaN NaN NaN NaN NaN NaN NaN 
6 NaN NaN NaN NaN NaN NaN NaN NaN 
7 54 66 65 NaN NaN NaN NaN NaN 

在IPython的筆記本電腦,你得到dataframes的一個不錯的HTML REPR: enter image description here

+0

這很不錯,+1 –

+0

謝謝你的回答,恐怕面具可能會佔用額外的記憶空間。是嗎? – Shirley

+0

@Shirley是的。但是,我不認爲800x5布爾數組是值得關注的。也就是說,我仍然強烈推薦使用熊貓數據框。 –

相關問題