【发布时间】:2018-08-29 20:12:38
【问题描述】:
我之前使用pickle 将数千个 2D numpy 数组 (600x600) 保存到二进制文件中。由于内存限制,我将它们一一保存,现在我想将它们一一读取,执行一些操作并将新数组(也是一一)保存到新文件中。然后我的最后一个目标是逐个读取这些新数组,并将像素值附加到与给定位置对应的新列表中。但由于某种原因,我收到了UnpickingError,但我不确定为什么。
import numpy as np
import pickle
def normalize(data_set):
data_set *= 1/data_set.max()
with open('final_images.data', 'a+b') as f:
pickle.dump(data_set, f)
return data_set
with open('initial_data.data', 'rb') as f:
while True:
try:
data_set = pickle.load(f)
# other operations
final_img = normalize(data_set)
except EOFError:
break
filename = 'final_images.data'
def sort_by_pixel(i, j):
pixels_at_position = []
with open(filename, 'rb') as f:
while True:
try:
array = pickle.load(f) #GET ERROR HERE
fp = np.memmap(filename, dtype='float32', mode='w+', shape=(600,600))
fp[:] = array[:]
pixels_at_position.append(fp[i][j])
except EOFError:
break
return pixels_at_position
stacked = []
for i in range(600):
for j in range(600):
stacked.append(np.median(sort_by_pixel(i, j)))
我在我指出的那一行得到的错误是:
pickle.UnpicklingError: invalid load key, '\x00'.
我做错了什么?
【问题讨论】:
-
当您
np.memmap(filename, …)时,这与您用于泡菜文件的文件名相同。因此,一旦您fp[:] = array[:],您将用原始数组数据替换所有泡菜数据。但是随后您尝试解开原始数组数据,就好像它是一个泡菜一样,但事实并非如此(除非您真的很不幸),所以它失败了。 -
我不确定您要在这里做什么,但修复可能就像拥有单独的
final_images.pkl和final_images.bin文件或其他东西一样简单。或者,它可能就像一开始不使用memmap,而只是附加array[i][j](或者,可能更好,array[i, j])一样简单。 -
我不太确定您的意思,但无论如何都会在
memmap行之前发生错误。而memmap我只是想生成一个数组(不会保存在内存中) -
但是(a)为什么你甚至需要那个 mmap,当你首先在内存中有完全相同的数组时,以及(b)你为什么要尝试使用同一个文件作为 mmap 的后备存储正在读取中?
-
您的代码在其他方面也令人困惑。您的
normalize函数将某些内容保存到文件中并执行没有值的return,因此它只返回None,但随后您使用final_img = normalize(data_set)调用它。我不确定那应该做什么,但我怀疑这与它实际做的不一样。
标签: python arrays python-3.x numpy pickle