当前位置:  开发笔记 > 编程语言 > 正文

以内存效率的方式生成包含随机布尔值的大型numpy数组

如何解决《以内存效率的方式生成包含随机布尔值的大型numpy数组》经验,为你挑选了1个好方法。

我需要创建一个包含随机布尔值的大型numpy数组,而不需要调用swap.

我的笔记本电脑有8 GB的RAM.创建一个(1200, 2e6)数组需要不到2秒,并使用2.29 GB的RAM:

>>> dd = np.ones((1200, int(2e6)), dtype=bool)
>>> dd.nbytes/1024./1024
2288.818359375

>>> dd.shape
(1200, 2000000)

对于相对较小的(1200, 400e3),np.random.randint仍然相当快,大约需要5秒才能生成458 MB阵列:

db = np.array(np.random.randint(2, size=(int(400e3), 1200)), dtype=bool)
print db.nbytes/1024./1024., 'Mb'

但是如果我将数组的大小增加一倍以(1200, 800e3)达到交换量,那么创建需要大约2.7分钟db;(

cmd = """
import numpy as np
db = np.array(np.random.randint(2, size=(int(800e3), 1200)), dtype=bool)
print db.nbytes/1024./1024., 'Mb'"""

print timeit.Timer(cmd).timeit(1)

使用random.getrandbits时间更长(约8分钟),并且还使用交换:

from random import getrandbits
db = np.array([not getrandbits(1) for x in xrange(int(1200*800e3))], dtype=bool)

使用 np.random.randintfor (1200, 2e6)just给出一个MemoryError.

有没有更有效的方法来创建(1200, 2e6)随机布尔数组?



1> ali_m..:

使用的一个问题np.random.randint是它生成64位整数,而numpy的np.booldtype仅使用8位来表示每个布尔值.因此,您正在分配比所需大8倍的中间数组.

避免中间64位dtypes的解决方法是使用生成一串随机字节np.random.bytes,可以使用转换为8位整数数组np.fromstring.然后可以将这些整数转换为布尔值,例如通过测试它们是否小于255*p,其中p是每个元素所需的概率True:

import numpy as np

def random_bool(shape, p=0.5):
    n = np.prod(shape)
    x = np.fromstring(np.random.bytes(n), np.uint8, n)
    return (x < 255 * p).reshape(shape)

基准测试:

In [1]: shape = 1200, int(2E6)

In [2]: %timeit random_bool(shape)
1 loops, best of 3: 12.7 s per loop

一个重要的警告是,概率将向下舍入到最接近的1/256的倍数(对于1/256的精确倍数,例如p = 1/2,这不应影响准确性).


更新:

更快的方法是利用以下事实:您只需要在输出数组中每0或1生成一个随机位.因此,您可以创建一个8位整数的随机数组,其大小为最终输出的1/8,然后将其转换为np.bool使用np.unpackbits:

def fast_random_bool(shape):
    n = np.prod(shape)
    nb = -(-n // 8)     # ceiling division
    b = np.fromstring(np.random.bytes(nb), np.uint8, nb)
    return np.unpackbits(b)[:n].reshape(shape).view(np.bool)

例如:

In [3]: %timeit fast_random_bool(shape)
1 loops, best of 3: 5.54 s per loop

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有