Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以连接内存映射文件?_Python_Arrays_Numpy_Memory Mapped Files - Fatal编程技术网

Python 是否可以连接内存映射文件?

Python 是否可以连接内存映射文件?,python,arrays,numpy,memory-mapped-files,Python,Arrays,Numpy,Memory Mapped Files,我用np.save()保存了几个numpy数组,并将它们组合在一起,它们相当大 是否可以将它们全部作为内存映射文件加载,然后在不将任何内容加载到内存的情况下对它们进行连接和切片?使用numpy。连接显然是将数组加载到内存中。为了避免这种情况,您可以在新文件中轻松创建第三个memmap数组,并从要连接的数组中读取值。以更有效的方式,您还可以将新阵列附加到磁盘上已存在的文件中 对于任何情况,都必须为数组选择正确的顺序(行主或列主) 以下示例说明如何沿轴0和轴1连接 1) 沿轴连接=0 a = np

我用np.save()保存了几个numpy数组,并将它们组合在一起,它们相当大


是否可以将它们全部作为内存映射文件加载,然后在不将任何内容加载到内存的情况下对它们进行连接和切片?

使用
numpy。连接
显然是将数组加载到内存中。为了避免这种情况,您可以在新文件中轻松创建第三个
memmap
数组,并从要连接的数组中读取值。以更有效的方式,您还可以将新阵列附加到磁盘上已存在的文件中

对于任何情况,都必须为数组选择正确的顺序(行主或列主)

以下示例说明如何沿轴0和轴1连接


1) 沿
轴连接=0

a = np.memmap('a.array', dtype='float64', mode='w+', shape=( 5000,1000)) # 38.1MB
a[:,:] = 111
b = np.memmap('b.array', dtype='float64', mode='w+', shape=(15000,1000)) # 114 MB
b[:,:] = 222
您可以在模式
r+
(读取和追加)中定义第三个数组,该数组读取与要连接的第一个数组(此处为
a
)相同的文件,但具有连接后要实现的最终数组的形状,如:

c = np.memmap('a.array', dtype='float64', mode='r+', shape=(20000,1000), order='C')
c[5000:,:] = b
沿
轴=0连接不需要传递
order='C'
,因为这已经是默认顺序


2) 沿
轴=1连接

a = np.memmap('a.array', dtype='float64', mode='w+', shape=(5000,3000)) # 114 MB
a[:,:] = 111
b = np.memmap('b.array', dtype='float64', mode='w+', shape=(5000,1000)) # 38.1MB
b[:,:] = 222
保存在磁盘上的数组实际上是扁平的,因此如果您使用
mode=r+
shape=(50004000)
创建
c
,而不更改数组顺序,则
a
中第二行的
1000
第一个元素将转到
c
中的第一行。但是您可以很容易地避免将
order='F'
(column major)传递到
memmap

c = np.memmap('a.array', dtype='float64', mode='r+',shape=(5000,4000), order='F')
c[:, 3000:] = b

这里有一个更新的文件“a.array”,其中包含连接结果。您可以重复此过程,以两人一组的方式连接

相关问题:


如果您使用
order='F'
,将导致另一个问题,当您下次加载文件时,它将退出一个混乱状态,甚至通过
order='F
。下面是我的解决方案,我做了很多测试,效果很好

fp = your old memmap...
shape = fp.shape
data = your ndarray...
data_shape = data.shape
concat_shape = data_shape[:-1] + (data_shape[-1] + shape[-1],)
print('cancat shape:{}'.format(concat_shape))
new_fp = np.memmap(new_file_name, dtype='float32', mode='r+', shape=concat_shape)
if len(concat_shape) == 1:
    new_fp[:shape[0]] = fp[:]
    new_fp[shape[0]:] = data[:]
if len(concat_shape) == 2:
    new_fp[:, :shape[-1]] = fp[:]
    new_fp[:, shape[-1]:] = data[:]
elif len(concat_shape) == 3:
    new_fp[:, :, :shape[-1]] = fp[:]
    new_fp[:, :, shape[-1]:] = data[:]
fp = new_fp
fp.flush()

可能的重复:当然,我尝试过简单的np.concatenate()一个内存映射数组的元组,结果是加载到内存中,并很快破坏了我的系统。阅读另一个线程,你想要实现的对我来说似乎是不可能的。虽然我真的能看出它的用处。如果只是关于切片,我有一两个想法,但这些想法对其他numpy UTIL不起作用。我想在这种特殊情况下,我只能生活在没有切片的情况下,但你当然可以自由分享你的想法。你有可能吗?在那里,您可以很好地进行切片,而无需加载整个内容。