我在理解numpy.memmap
的工作方式时遇到了问题。背景是我需要通过删除条目来减少保存在光盘上的大numpy
个数组。通过复制所需的部分来读取阵列并建立一个新的部分并不起作用 - 它只是不适合记忆。所以我的想法是使用numpy.memmap
- 即在光盘上工作。她是我的代码(带有一个小文件):
import numpy
in_file = './in.npy'
in_len = 10
out_file = './out.npy'
out_len = 5
# Set up input dummy-file
dummy_in = numpy.zeros(shape=(in_len,1),dtype=numpy.dtype('uint32'))
for i in range(in_len):
dummy_in[i] = i + i
numpy.save(in_file, dummy_in)
# get dtype and shape from the in_file
in_npy = numpy.load(in_file)
in_dtype = in_npy.dtype
in_shape = (in_npy.shape[0],1)
del(in_npy)
# generate an 'empty' out_file with the desired dtype and shape
out_shape = (out_len,1)
out_npy = numpy.zeros(shape=out_shape, dtype=in_dtype)
numpy.save(out_file, out_npy)
del(out_npy)
# memmap both files
in_memmap = numpy.memmap( in_file, mode='r', shape=in_shape, dtype=in_dtype)
out_memmap = numpy.memmap(out_file, mode='r+', shape=out_shape, dtype=in_dtype)
print "in_memmap"
print in_memmap, "\n"
print "out_memmap before in_memmap copy"
print out_memmap, "\n"
# copy some parts
for i in range(out_len):
out_memmap[i] = in_memmap[i]
print "out_memmap after in_memmap copy"
print out_memmap, "\n"
out_memmap.flush()
# test
in_data = numpy.load(in_file)
print "in.npy"
print in_data
print in_data.dtype, "\n"
out_data = numpy.load(out_file)
print "out.npy"
print out_data
print out_data.dtype, "\n"
运行此代码我得到:
in_memmap
[[1297436307]
[ 88400]
[ 662372422]
[1668506980]
[ 540682098]
[ 880098343]
[ 656419879]
[1953656678]
[1601069426]
[1701081711]]
out_memmap before in_memmap copy
[[1297436307]
[ 88400]
[ 662372422]
[1668506980]
[ 540682098]]
out_memmap after in_memmap copy
[[1297436307]
[ 88400]
[ 662372422]
[1668506980]
[ 540682098]]
in.npy
[[ 0]
[ 2]
[ 4]
[ 6]
[ 8]
[10]
[12]
[14]
[16]
[18]]
uint32
out.npy
[[0]
[0]
[0]
[0]
[0]]
uint32
从输出中可以清楚地看出我做错了什么:
1)memmap
不包含数组中设置的值,in_memmap
和out_memmap
包含相同的值。
2)目前尚不清楚复制命令是否复制了从in_memmap
到out_memmap
的任何内容(由于相同的值)。在调试模式中检查in_memmap[i]
和out_memmap[i]
的值,我得到两个:memmap([1297436307], dtype=uint32)
。我可以在代码中分配它们,还是必须使用:out_memmap[i][0] = in_memmap[i][0]
?
3)out.npy
操作未将out_memmap
更新为flush()
值。
任何人都可以帮助我理解我在这里做错了什么。
非常感谢
答案 0 :(得分:0)
将np.lib.format.open_memmap
的每个实例替换为in_memmap
[[ 0]
[ 2]
[ 4]
[ 6]
[ 8]
[10]
[12]
[14]
[16]
[18]]
out_memmap before in_memmap copy
[[0]
[0]
[0]
[0]
[0]]
out_memmap after in_memmap copy
[[0]
[2]
[4]
[6]
[8]]
in.npy
[[ 0]
[ 2]
[ 4]
[ 6]
[ 8]
[10]
[12]
[14]
[16]
[18]]
uint32
out.npy
[[0]
[2]
[4]
[6]
[8]]
uint32
并获取:
np.save
np.memmap
添加了np.lib.format.open_memmap
正在读取的标头,这就是两个数据看起来相同的原因(因为它是相同的标头)。这也是为什么当你将数据从一个复制到另一个时它没有任何效果(因为它只是复制标题而不是数据){{1}}会自动跳过标题,以便你可以处理数据。