Python 存储二维数据的最佳方式是什么
我正在使用Python2.7 我有一个二维数组,如下所示:Python 存储二维数据的最佳方式是什么,python,list,Python,List,我正在使用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,
[[ 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屏蔽阵列或熊猫数据帧来说,这是一个很好的例子。原因如下:
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)
数据帧(文本版本):
在IPython笔记本中,您可以获得数据帧的漂亮HTML报告:
或许可以尝试使用SciPy提供的稀疏矩阵。您想要使用的具体值取决于您正在进行的计算
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]])
这将占用更少的内存空间(对于大型矩阵),并且对行进行切片/迭代的速度很快。(但它是缓慢的切片,在列上迭代。)这是一个列表而不是数组。请看一下稀疏。我个人会使用numpy掩码数组或pandas DataFrame,如果您能够描述希望执行的操作类型,您可能会得到更集中的答案。此外,8*500阵列在数据存储/操作方面没有那么大,使用矢量化numpy函数在其上操作几乎是即时的。这很好,+1谢谢你的回答,我担心掩码可能会占用额外的内存空间。是吗?@Shirley Yes。然而,我不认为800x5布尔数组会引起太多的关注。尽管如此,我还是强烈推荐使用熊猫数据帧。非常感谢。在使用M.todense()之后,是否可以将空条目更改为-1,这样它就不会与有效数据0冲突?我将编写一对循环。穿过行的外部循环。从末端开始并向后运行的在列上的内部循环。当当前位置的值等于零时,将其设置为-1。当它不为零时,中断内部循环,并转到下一行。
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]])