Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.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 在Memmapped数组上执行操作的正确方法_Python_Numpy - Fatal编程技术网

Python 在Memmapped数组上执行操作的正确方法

Python 在Memmapped数组上执行操作的正确方法,python,numpy,Python,Numpy,让我困惑的手术是这样的。我一直在常规Numpy阵列上进行此操作,但在memmap上,我希望了解它是如何工作的 arr2 = np.argsort(np.argsort(arr1,axis=0),axis=0) / float(len(arr1)) * 100 #This is basically to calculate Percentile rank of each value wrt the entire column 这是我在普通numpy阵列上使用的 现在。考虑到arr1现在是一个20

让我困惑的手术是这样的。我一直在常规Numpy阵列上进行此操作,但在memmap上,我希望了解它是如何工作的

arr2 = np.argsort(np.argsort(arr1,axis=0),axis=0) / float(len(arr1)) * 100
#This is basically to calculate Percentile rank of each value wrt the entire column
这是我在普通numpy阵列上使用的

现在。考虑到arr1现在是一个20GB内存映射阵列,我有几个问题:

1:

arr2 = np.argsort(np.argsort(arr1,axis=0),axis=0) / float(len(arr1)) * 100 
我想arr2应该是一个常规的numpy数组吧?所以执行这将是灾难性的内存明智的,对吗

考虑到我现在创建的
arr2
是一个大小正确的Memmapped数组(用全零填充)

2:

arr2 = np.argsort(np.argsort(arr1,axis=0),axis=0) / float(len(arr1)) * 100
vs

有什么区别

3.

np.argsort
分别计算为临时memmapped数组和
np.argsort(np.argsort)
作为临时memmapped数组,然后执行该操作是否会更节省内存?因为20GB阵列的argsort阵列本身就相当大

我认为这些问题将帮助我澄清python中memmapped数组的内部工作原理


谢谢…

我将先回答第2部分,然后回答第1部分和第3部分

首先,
arr=
是简单的变量赋值,而
arr[:]=
赋值给数组的内容。在下面的代码中,在
arr[:]=x
之后,
arr
仍然是一个memmapped数组,而在
arr=x
之后,
arr
是一个ndarray

>>> arr = np.memmap('mm', dtype='float32', mode='w+', shape=(1,10000000))
>>> type(arr)
<class 'numpy.core.memmap.memmap'>
>>> x = np.ones((1,10000000))
>>> type(x)
<class 'numpy.ndarray'>
>>> arr[:] = x
>>> type(arr)
<class 'numpy.core.memmap.memmap'>
>>> arr = x
>>> type(arr)
<class 'numpy.ndarray'>
好的,现在有什么不同。使用
arr[:]=np.argsort(arr)
,如果我们查看对memmapped文件的更改,就会发现对arr的每一次更改都会导致文件md5sum的更改

>>> import os
>>> import numpy as np
>>> arr = np.memmap('mm', dtype='float32', mode='w+', shape=(1,10000000))
>>> arr[:] = np.zeros((1,10000000))
>>> os.system("md5sum mm")
48e9a108a3ec623652e7988af2f88867  mm
0
>>> arr += 1.1
>>> os.system("md5sum mm")
b8efebf72a02f9c0b93c0bbcafaf8cb1  mm
0
>>> arr[:] = np.argsort(arr)
>>> os.system("md5sum mm")
c3607e7de30240f3e0385b59491ac2ce  mm
0
>>> arr += 1.3
>>> os.system("md5sum mm")
1e6af2af114c70790224abe0e0e5f3f0  mm
0
我们看到,
arr
仍然保留其
\u mmap
属性

>>> arr._mmap
<mmap.mmap object at 0x7f8e0f086198>
现在“_mmap”属性是None

>>> arr._mmap
>>> type(arr._mmap)
<class 'NoneType'>
>>arr.\u mmap
>>>类型(arr.\U mmap)
现在是第三部分。在执行复杂操作时,似乎很容易丢失对memmapped对象的引用。我目前的理解是,您必须将事情分解并使用
arr[:]=
获得中间结果


在使用numpy 1.8.1和Python 3.4.1时,必须在可用的地方使用
out
参数。否则你总是会得到临时拷贝。(当然,inplace操作符
+=
通常使用out参数)@seberg你能详细说明一下吗?
out
参数是什么?
>>> arr._mmap
<mmap.mmap object at 0x7f8e0f086198>
>>> import os
>>> import numpy as np
>>> arr = np.memmap('mm', dtype='float32', mode='w+', shape=(1,10000000))
>>> arr[:] = np.zeros((1,10000000))
>>> os.system("md5sum mm")
48e9a108a3ec623652e7988af2f88867  mm
0
>>> arr += 1.1
>>> os.system("md5sum mm")
b8efebf72a02f9c0b93c0bbcafaf8cb1  mm
0
>>> arr = np.argsort(arr)
>>> os.system("md5sum mm")
b8efebf72a02f9c0b93c0bbcafaf8cb1  mm
0
>>> arr += 1.3
>>> os.system("md5sum mm")
b8efebf72a02f9c0b93c0bbcafaf8cb1  mm
0
>>> type(arr)
<class 'numpy.core.memmap.memmap'>
>>> arr._mmap
>>> type(arr._mmap)
<class 'NoneType'>