Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 存储二维数据的最佳方式是什么_Python_List - Fatal编程技术网

Python 存储二维数据的最佳方式是什么

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,

我正在使用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屏蔽阵列或熊猫数据帧来说,这是一个很好的例子。原因如下:

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]])