二进制阵列的快速随机置换

时间:2015-06-11 01:14:29

标签: arrays numpy random binary permutation

对于我的项目,我希望快速生成固定长度和给定数量的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秒。为了我的程序的目的,我想减少一个数量级。任何人都可以建议更快的方法吗?

谢谢!

1 个答案:

答案 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)就地而不是从排列中返回另一个数组,但对我而言,差异可以忽略不计