我编写了以下方法(在python 2.7中),它生成一组整数并将它们转换为二进制表示。它需要不言自明的两个参数:total_num_nodes
和dim
。它返回numpy matrix-like,包含所有这些整数的二进制表示:
def generate(total_num_nodes, dim):
# Generate random nodes from the range (0, dim-1)
nodes_matrix = [random.randint(0, 2 ** dim - 1) for _ in range(total_num_nodes)]
# Removes duplicates
nodes_matrix = list(set(nodes_matrix))
# Transforms each node from decimal to string representation
nodes_matrix = [('{0:0' + str(dim) + 'b}').format(x) for x in nodes_matrix]
# Transforms each bit into an integer.
nodes_matrix = np.asarray([list(map(int, list(x))) for x in nodes_matrix], dtype=np.uint8)
return nodes_matrix
问题在于,当我传递非常大的值时,比如total_num_nodes= 10,000,000
和dim=128
,生成时间需要很长时间。我的一个朋友告诉我,以下行实际上是一个瓶颈,它可能是大部分计算时间的原因:
# Transforms each node from decimal to string representation
nodes_matrix = [('{0:0' + str(dim) + 'b}').format(x) for x in nodes_matrix]
我想不出能够重新启动此行的其他更快的方法,以便在单个处理器上运行时加快生成时间。你的任何建议真的很感激。
谢谢
答案 0 :(得分:1)
在numpy中做到这一切并且会更快。
以下内容生成total_num_nodes
行dim
列np.uint8
数据,然后通过提供适合np.unique
的数据视图来保留唯一行,然后翻译回来到2D数组:
import numpy as np
def generate(total_num_nodes, dim):
a = np.random.choice(np.array([0,1],dtype=np.uint8),size=(total_num_nodes,dim))
dtype = a.dtype.descr * dim
temp = a.view(dtype)
uniq = np.unique(temp)
return uniq.view(a.dtype).reshape(-1,dim)