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

Rox*_*nne 8 python arrays numpy

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

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

locationsPx = cv2.findNonZero(SomeBWImage)
Run Code Online (Sandbox Code Playgroud)

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

print(locationsPx[0]) : array([[1649,    4]])
Run Code Online (Sandbox Code Playgroud)

例如.

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

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

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

小智 1

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

coordlist = []
coordlist.append(locationsPx[0])
Run Code Online (Sandbox Code Playgroud)

dict或者,如果您的图像有名称,则使用带有图像名称作为键的a 可能会很有吸引力:

coorddict = {}
coorddict[image_name] = locationsPx[0]
Run Code Online (Sandbox Code Playgroud)

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

for coords in coordlist:
Run Code Online (Sandbox Code Playgroud)

或者

for image_name, coords in coorddict.items():
Run Code Online (Sandbox Code Playgroud)

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

import pickle
with open("filename.pkl", "wb") as f:
    pickle.dump(coordlist, f, pickle.HIGHEST_PROTOCOL)
Run Code Online (Sandbox Code Playgroud)

(或者与coorddict坐标列表相同)。重新加载也非常简单:

with open("filename.pkl", "rb") as f:
    coordlist = pickle.load(f)
Run Code Online (Sandbox Code Playgroud)

存在一些安全问题pickle,但如果您只加载自己创建的文件,则这些问题不适用。

如果您发现自己经常向以前腌制的文件添加内容,那么使用替代后端可能会更好,例如sqlite.