我需要创建一个大的numpy数组,其中包含随机布尔值,而不会导致交换。
我的笔记本电脑有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)
,就会遇到交换问题,并且创建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)
使用np.random.randint
创建一个(1200, 2e6)
的随机数数组会产生一个MemoryError
错误。
有没有更有效的方法来创建一个(1200, 2e6)
的随机布尔数组?
.view(np.bool)
或者.astype(np.bool, copy=False)
,而不是.astype(np.bool)
,那么你的最后一个解决方案会更快,因为这两种方法都可以避免复制整个数组。 - Jaime.astype()
默认返回副本。 - ali_m255*p
进行比较”的策略存在一个限制,即概率被舍入为1/256的倍数,而不总是“正确”的1/256倍数。 - user2357112