我正在使用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]]
这样,在数据操作过程中,我需要进行追加或删除。
存储数据的最佳方式是什么?非常感谢
答案 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数据帧:
答案 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]])
这将占用内存中较少的空间(对于大型矩阵),并且对行进行切片/迭代很快。 (但它是缓慢切片,迭代列。)