Кaк вставить в матрицу нулей на случайные места целые числа без повторений?

Как вставить в матрицу нулей matrix_zero на случайные места все целые числа от 1 до N так, чтобы они не повторялись.

Пока написал вот такой код:

i = 1                                                                                                                                                
matrix_zero = np.zeros((5, 5))
 
print(matrix_zero)

N = # некое целое число 
while np.count_nonzero(matrix_zero) < N:
     
    matrix_zero[random.randint(0, 4)][random.randint(0, 4)] = i
    i += 1

Как его дополнить до правильного?


Ответы (2 шт):

Автор решения: CrazyElf

Я бы сделал так:

import numpy as np

n = 5
k = 9 #len(aliens)
matrix_zero = np.zeros(n * n, dtype=np.int)
matrix_zero[:k] = range(1, k + 1)
np.random.shuffle(matrix_zero)
matrix_zero = matrix_zero.reshape((n, n))
print(matrix_zero)

[[0 9 4 0 0]
 [3 0 0 0 0]
 [0 7 0 6 0]
 [0 0 5 1 8]
 [0 0 2 0 0]]
→ Ссылка
Автор решения: MaxU
In [42]: m = np.zeros((5, 5))

In [43]: N = 8

In [44]: m[np.unravel_index(np.random.choice(np.arange(np.prod(m.shape)), 
                                             size=N, 
                                             replace=False), 
                            m.shape)] = np.arange(1, N+1)

результат:

In [45]: m
Out[45]:
array([[0., 2., 0., 0., 0.],
       [0., 4., 0., 0., 6.],
       [0., 5., 0., 0., 1.],
       [3., 0., 0., 0., 0.],
       [0., 8., 0., 0., 7.]])
→ Ссылка