2015-06-11 4 views
0

Для моего проекта я хочу быстро генерировать случайные перестановки двоичного массива фиксированной длины и заданного числа 1s и 0s. Учитывая эти случайные перестановки, я хочу добавить их по-разному.Быстрая случайная перестановка двоичного массива

В настоящее время я использую объект ndarray numpy, который удобен для добавления в элемент. Мой текущий код выглядит следующим образом:

# 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

просто любопытно, 'python -O'? –

ответ

0

Для меня вариант с выделением массива вне цикла был быстрее, но не намного - 8% или около того, с помощью Cprofile

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) на месте, а не возвращая массив из перестановки, но для меня разница была незначительной

Смежные вопросы