Как создать уникальные случайные числа в виде массива в Python? - PullRequest
2 голосов
/ 10 июля 2019

У меня есть массив с размером (4,4), который может иметь значения 0 и 1, поэтому я могу иметь 65536 различных массивов. Мне нужно создать все эти массивы без повторения. Я использую wt_random=np.random.randint(2, size=(65536,4,4)), но я боюсь, что они не уникальны. Не могли бы вы сказать мне, что этот код является правильным или нет, и что я должен сделать, чтобы получить все возможные массивы? Спасибо.

Ответы [ 4 ]

2 голосов
/ 10 июля 2019

вы можете использовать numpy.meshgrid

output = np.array(np.meshgrid(*[[0,1] for _ in range(16)])).T.reshape(-1, 4,4)

, так как вам нужно получить все возможные значения (количество возможных значений = 2 ^ 16 = 65536)

2 голосов
/ 10 июля 2019

вы можете использовать itertools.product с repeat=16 для генерации всех шаблонов, а затем просто изменить их на (4,4).

попробуйте это:

import numpy as np
from itertools import product

wt_random = np.array([np.array(p).reshape((4, 4)) for p in product((0, 1), repeat=16)])
np.random.shuffle(wt_random)

print(wt_random.shape)
print(wt_random[1234])

Вывод: (показывает правильную форму и пример элемента)

(65536, 4, 4)
[[0 0 0 0]
 [0 1 0 0]
 [1 1 0 1]
 [0 0 1 0]]
0 голосов
/ 10 июля 2019

Если вам нужны все возможные массивы в случайном порядке, попробуйте перечислить их в любом произвольном детерминированном порядке, а затем перемешать их, чтобы рандомизировать порядок.Если вам не нужны все массивы в памяти, вы можете написать функцию для генерации массива в заданной позиции в детерминированном списке, а затем перемешать позиции.Обратите внимание, что Fisher-Yates может даже не понадобиться плотное представление списка для перемешивания ... если вы отслеживаете, где заканчиваются уже перемешанные записи, у вас должно быть достаточно.

0 голосов
/ 10 июля 2019

Вы можете перебрать n от 1 до 65535, а затем сопоставить двоичный эквивалент с вашим массивом, который будет самым простым и на 100% действительно уникальным, и все возможности будут включены.

Например, для m1-> 0: [[0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0]] для m2-> 1: [[0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,1]]

     ----------------------------------------------------
     -----------------------------------------------   upto n

для m65536->65535: [[1,1,1,1], [1,1,1,1], [1,1,1,1], [1,1,1,1]]

...