我使用的是 Python2.7。
我有一个像这样的二维数组:
[[ 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]]
这样,在数据操作过程中,我需要做追加或删除。
存储数据的最佳方式是什么?非常感谢
最佳答案
对于 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)
数据框(文字版):
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:
关于python - 存储 2D 数据的最佳方式是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22255929/