- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我感到困惑的操作看起来像这样。我一直在常规 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
对比
arr2[:] = np.argsort(np.argsort(arr1,axis=0),axis=0) / float(len(arr1)) * 100
有什么区别?
3.
单独计算np.argsort
作为临时内存映射数组和np.argsort(np.argsort)
作为临时内存映射数组然后做手术?因为 20GB 数组的 argsort 数组本身就非常庞大!
我认为这些问题将帮助我弄清楚 python 中内存映射数组的内部工作原理!
谢谢...
最佳答案
我将尝试先回答第 2 部分,然后是第 1 部分和第 3 部分。
首先,arr = <something>
是简单的变量赋值,而 arr[:] = <something>
分配给数组的内容。在下面的代码中,在 arr[:] = x
之后, arr
仍然是一个内存映射数组,而在 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'>
在np.argsort
的情况下,它返回一个与其参数类型相同的数组。因此,在这种特定情况下,我认为执行 arr = np.argsort(x)
应该没有区别。或 arr[:] = np.argsort(x)
.在您的代码中,arr2
将是一个内存映射数组。但还是有区别的。
>>> arr = np.memmap('mm', dtype='float32', mode='w+', shape=(1,10000000))
>>> x = np.ones((1,10000000))
>>> arr[:] = x
>>> type(np.argsort(x))
<class 'numpy.ndarray'>
>>> type(np.argsort(arr))
<class 'numpy.core.memmap.memmap'>
好的,现在有什么不同了。使用 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
仍然保留其 _mmap
属性。
>>> arr._mmap
<mmap.mmap object at 0x7f8e0f086198>
现在使用 arr = np.argsort(x)
,我们看到 md5sums 停止变化。尽管arr
的类型是内存映射数组,它是一个新对象,似乎内存映射被删除了。
>>> 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'>
现在 '_mmap' 属性为 None。
>>> arr._mmap
>>> type(arr._mmap)
<class 'NoneType'>
现在是第 3 部分。在执行复杂操作时,似乎很容易丢失对内存映射对象的引用。我目前的理解是你必须分解并使用 arr[:] = <>
中间结果。
使用 numpy 1.8.1 和 Python 3.4.1
关于python - 对 Memmapped 数组进行操作的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25567589/
使用 numpy 的 有意义吗? memmap 跨多核(MPI)? 我在磁盘上有一个文件。 我可以创建一个单独的 memmap 每个核心上的对象,并使用它从文件中读取不同的切片? 给它写信怎么样? 最
我有一个包含电流和电压数据的非常大(10-100 GB)文件的内存映射。从给定的起始索引,我想找到电压满足给定条件的下一个点的索引。 如果列表相对较小,我可以使用迭代器来完成此操作,如下所示: fil
我试图在两个巨大的矩阵 (10*25,000,000) 之间生成一个普通的矩阵乘法。当我这样做时,我的内存力耗尽了。我如何使用 numpy 的 memmap 来处理这个问题?这是个好主意吗?我不太担心
我需要在内存中保存一个非常大的向量,大小大约为 10**8,并且我需要对其进行快速随机访问。我尝试使用 numpy.memmap,但遇到以下错误: RuntimeWarning: overflow e
我无法删除 numpy.memmap 函数创建的文件 class MyClass def __init__(self): self.fp = np.memmap(filename, dty
我有一个大型 (75000 x 5 x 6000) 3D 数组,存储为 NumPy 内存映射。如果我只是像这样迭代第一个维度: import numpy as np import time a = n
是否可以在不知道形状的情况下加载 numpy.memmap 并仍然恢复数据的形状? data = np.arange(12, dtype='float32') data.resize((3,4)) f
是否可以使用 numpy.memmap将基于磁盘的大型字符串数组映射到内存中? 我知道它可以用于 float 等,但这个问题专门针对字符串。 我对固定长度和可变长度字符串的解决方案都很感兴趣。 解决方
我有一个庞大的数据集,我希望对其进行 PCA。我受限于 RAM 和 PCA 的计算效率。因此,我转而使用迭代 PCA。 数据集大小-(140000,3504) documentation声明 此算法具
我正在尝试创建随机矩阵并使用 numpy.save 将其保存在二进制文件中 然后我尝试使用 numpy.memmap 映射这个文件,但它似乎映射错误。 如何解决? 它似乎读取了 .npy header
我感到困惑的操作看起来像这样。我一直在常规 Numpy 数组上这样做,但在 memmap 上我想了解它是如何工作的。 arr2 = np.argsort(np.argsort(arr1,axis=0)
我对 numpy 的 memmap 感到困惑使用写时复制 (mmap_mode=c) 时处理对数据的更改。由于没有将任何内容写入磁盘上的原始数组,因此我希望它必须将所有更改存储在内存中,因此如果您修改
我正在尝试使用一个非常大的 numpy 数组,使用 numpy memmap,将每个元素作为 ctypes 结构访问。 class My_Structure(Structure): _fiel
如何将大图像读取为 numpy.memmap 对象,以便可以操纵它们的像素并将它们保存回来?提前致谢。 最佳答案 在不知道更多细节的情况下,我会使用 scipy.misc.imread . Scipy
我想创建一个 memmap在 MATLAB 中。在 python 中,我可以通过以下方式做到这一点: ut = np.memmap('my_array.mmap', dtype=np.float64,
我有一个时间戳数组,矩阵 X 的第 2 列中的每一行都递增。我计算了时间戳的平均值,它大于最大值。我正在使用 numpy memmap 进行存储。为什么会这样? >>> self.X[:,1] mem
使用 numpy 的 memmap 打开设备文件(而不是常规文件)是否有原因不起作用? self.surface = np.memmap('/dev/fb1', dtype=np.uint16, mo
我正在处理一堆大型 numpy 数组,由于最近这些数组开始占用太多内存,我想用 numpy.memmap 实例替换它们。问题是,有时我必须调整数组的大小,我最好就地这样做。这对普通数组非常有效,但在
我在 x32 win xp 上使用 python x32 有时程序上线失败 fp = np.memmap('C:/memmap_test', dtype='float32', mode='w+', s
我使用 memmap=8G$4G Linux 内核启动参数保留内存块。 是否需要ioremap此内存? ioremap 手册页说: ioremap performs a platform specif
我是一名优秀的程序员,十分优秀!