什么是存储我的2D数据的最佳方式

时间:2014-03-07 16:50:00

标签: python list

我正在使用Python2.7。

我有一个像这样的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]]

这样,在数据操作过程中,我需要进行追加或删除。

存储数据的最佳方式是什么?非常感谢

2 个答案:

答案 0 :(得分:6)

这是一个numpy蒙面数组或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

我更喜欢数据帧而不是屏蔽数组。最明显的原因是默认的REPR

蒙面数组:

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)

dataframe(文本版):

    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 Notebook中,您可以获得一个很好的HTML REPR数据帧: enter image description here

答案 1 :(得分: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]])

这将占用内存中较少的空间(对于大型矩阵),并且对行进行切片/迭代很快。 (但它是缓慢切片,迭代列。)