我需要在不命中交换的情况下创建一个包含随机布尔值的大型numpy数组。
我的笔记本电脑有8 GB的内存。创建一个(1200, 2e6)
阵列只需不到2秒,使用2.29 GB内存:
>>> dd = np.ones((1200, int(2e6)), dtype=bool)
>>> dd.nbytes/1024./1024
2288.818359375
>>> dd.shape
(1200, 2000000)
对于相对较小的(1200, 400e3)
,np.random.randint
仍然相当快,大约需要5秒来生成一个458MB的数组:
db = np.array(np.random.randint(2, size=(int(400e3), 1200)), dtype=bool)
print db.nbytes/1024./1024., 'Mb'
但是如果我将数组的大小加倍到(1200, 800e3)
,那么就会遇到交换,创建db
需要大约2.7分钟;(
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)
对(1200, 2e6)
使用np.random.randint
只会给出一个MemoryError
。
有没有更有效的方法来创建(1200, 2e6)
随机布尔数组?
https://stackoverflow.com/questions/34485591
复制相似问题