我有很多100x100px的黑/白GIF图像。 我想在Numpy中使用它们来训练机器学习算法,但我想将它们保存在一个易于在Python / Numpy中可读的文件中。 通过说很多我的意思是数十万,所以我想利用每像素只携带1位的图像。
我对如何做到这一点有任何想法?
编辑:
我在bitstring模块中使用了BitArray对象。然后我用numpy.savez保存了它。问题是保存需要很长时间。我从未设法在整个数据集上看到此过程的结束。我试图保存一个小子集,花了10分钟,大约是小子集本身的20倍。
我将尝试使用BoolArray,感谢您的参考。
编辑(已解决):
我通过使用与您链接的问题中找到的方法不同的方法解决了问题。我在这里找到了numpy.packbits函数:numpy boolean array with 1 bit entries
我在这里报告我的代码,因此对其他人有用:
accepted_shape = (100, 100)
images = []
for file_path in gifs:
img_data = imread(file_path)
if img_data.shape != accepted_shape:
continue
max_value = img_data.max()
min_value = img_data.min()
middle_value = (max_value - min_value) // 2
image = np.packbits((img_data.ravel() > middle_value).astype(int))
images.append(image)
np.vstack(images)
np.savez_compressed('dataset.npz', shape=accepted_shape, images=images)
这在解压缩时需要注意,因为如果位数不是8的倍数,则添加一些零作为填充。这就是我解压缩文件的方式:
data = np.load('dataset.npz')
shape = data['shape']
images = data['images']
nf = np.prod(shape)
ne = images.size / nf
images = np.unpackbits(images, axis=1)
images = images[:,:nf]
答案 0 :(得分:0)
PyTables似乎是一个不错的选择。这样的事情可能有用:
import numpy as np
import tables as tb
nfiles = 100000 #or however many files you have
h5file = tb.openFile('data.h5', mode='w', title="Test Array")
root = h5file.root
x = h5file.createCArray(root,'x',tb.Float64Atom(),shape=(100,100,nfiles))
x[:100,:100, 0] = np.random.random(size=(100,100)) # Now put in some data
h5file.close()