有没有内存-生成包含随机布尔值的大型numpy数组的有效方法?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (29)

我需要创建一个包含随机布尔值的大型numpy数组,而不需要点击交换。

我的笔记本电脑有8GB内存。创建一个(1200, 2e6)数组占用的内存小于2s,并使用2.29GB的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.randint为了(1200, 2e6)只是给了一个MemoryError

是否有更有效的方法来创建(1200, 2e6)随机布尔阵列?

提问于
用户回答回答于

可以:

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

扫码关注云+社区