Мой код должен проверять, является ли случайно сгенерированный массив столбцом большой матрицы на каждой итерации. Код выглядит так:

large_matrix=np.zeros((arr_size,loop_size))
flag = 0
while flag < loop_size:
    arr = arr_generator(arr_size)
    dist = np.sum(large_matrix-arr,axis=0)
    if 0 in dist:
        continue
    else:
        large_matrix[:,flag] = arr
        flag += 1

Arr является двоичным , потому что большая _matrix занимает много памяти . Этот фрагмент кода довольно медленный. Есть ли более эффективный способ решения этой проблемы в numpy?

1
Sizhe 27 Апр 2018 в 18:48

1 ответ

Лучший ответ

В этом вопросе использование уникальности произведения простых чисел может быть хорошим способом решения проблемы. Чтобы использовать простые числа, нам понадобятся:

  1. массив, используемый для хранения простых чисел

  2. генератор массива, который может выдавать информацию об индексах различных типов элементов (поскольку массив в этом случае является двоичным, нам нужно знать только индекс одного типа элемента в массиве.)

  3. Чтобы решить проблему переполнения, вызванную произведением простых чисел, нам нужно вычислить логарифм произведения:

Код переписывается следующим образом:

PRIME_NUMBER=np.array([2,3,5,7,11,13,17,23,29,31....], dtype='float')
flag = 0
loop_size = 100000
arr_size = 8
config = np.zeros(loop_size)
large_matrix=np.zeros((arr_size,loop_size))

while flag < loop_size:
    arr, idx = arr_generator(arr_size)
    prod = np.round(np.log10(np.prod(PRIME_NUMBER[idx])), 3)
    if prod in config:
        continue
    else:
        large_matrix[:,flag] = arr
        flag += 1
0
Lonitch 4 Май 2018 в 21:05