在python中存储百万像素的最佳数据结构?

时间:2016-10-11 13:52:46

标签: python arrays numpy

我有几个图像,经过一些基本处理和轮廓检测后,我想将检测到的像素位置及其相邻的邻居值存储到Python数据结构中。我选择 numpy.array

使用以下方法检索每个Image的像素位置:

locationsPx = cv2.findNonZero(SomeBWImage)

将返回一个形状数组(NumberOfPixels,1L,2L):

print(locationsPx[0]) : array([[1649,    4]])

例如。

我的问题是:是否可以将此双数组存储在另一个数组中的单个列上?或者我应该使用列表并将所有数组放在一起?

注意:图像的数据集可能会增加,因此我选择的数据结构的尺寸不仅很大,而且变量

编辑:或者numpy.array不是个好主意,而Pandas Dataframe更适合?我愿意接受那些有更多经验的人的建议。

1 个答案:

答案 0 :(得分:1)

Numpy数组非常适合计算。如果数据大小不断变化,则它们不适用于存储数据。正如ali_m指出的那样,numpy中所有形式的数组连接本质上都是缓慢的。最好将数组存储在普通的python列表中:

coordlist = []
coordlist.append(locationsPx[0])

或者,如果您的图像有名称,则最好使用dict作为图像名称作为键:

coorddict = {}
coorddict[image_name] = locationsPx[0]

无论哪种方式,您都可以轻松地遍历列表的内容:

for coords in coordlist:

for image_name, coords in coorddict.items():

pickle是将结果存储在文件中的便捷方法:

import pickle
with open("filename.pkl", "wb") as f:
    pickle.dump(coordlist, f, pickle.HIGHEST_PROTOCOL)

(或与coorddict相同,而不是协调列表)。 重装也很容易:

with open("filename.pkl", "rb") as f:
    coordlist = pickle.load(f)

pickle有一些安全方面的问题,但是,如果仅加载自己创建的文件,则这些问题将不适用。

如果您发现自己经常添加到以前的腌制文件中,则最好使用备用后端,例如sqlite