对于我的项目,我希望快速生成固定长度和给定数量的1和0的二进制数组的随机排列。鉴于这些随机排列,我希望以元素方式添加它们。
我目前正在使用numpy的ndarray对象,这对于添加elementwise非常方便。我目前的代码如下:
# n is the length of the array. I want to run this across a range of
# n=100 to n=1000.
row = np.zeros(n)
# m_list is a given list of integers. I am iterating over many possible
# combinations of possible values for m in m_list. For example, m_list
# could equal [5, 100, 201], for n = 500.
for m in m_list:
row += np.random.permutation(np.concatenate([np.ones(m), np.zeros(n - m)]))
我的问题是,有没有更快的方法呢?根据timeit,1000000次调用“np.random.permutation(np.concatenate([np.ones(m),np.zeros(n - m)]))”需要49.6秒。为了我的程序的目的,我想减少一个数量级。任何人都可以建议更快的方法吗?
谢谢!
答案 0 :(得分:0)
对于我在循环外部进行数组分配的版本 使用cProfile
更快但不多 - 大约8%左右row = np.zeros(n, dtype=np.float64)
wrk = np.zeros(n, dtype=np.float64)
for m in m_list:
wrk[0:m] = 1.0
wrk[m:n] = 0.0
row += np.random.permutation(wrk)
您可以尝试shuffle(wrk)
就地而不是从排列中返回另一个数组,但对我而言,差异可以忽略不计