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

标签 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, -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: enter image description here

关于python - 存储 2D 数据的最佳方式是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22255929/

相关文章:

python - networkx:更改 draw_circular 中的节点颜色

python - 如何从列表列表中制作平面列表?

python - 就地替换python中列表中所有出现的元素

c++ - 使用 STL 列表获取最高值

python - 使用 Keras 后端函数时出现 InvalidArgumentError

python - 如何在python标点符号之前而不是标点符号之后删除空格

Python获取列表中元素的排名奇怪的行为

python - 计算数据帧 A 的每一行在另一个数据帧的许多元素的每一行中出现的次数

c# - LINQ 将行分组为列

python - 从字典中删除其键是列表元素的所有元素