Разреженная матрица один 1 для каждой строки - PullRequest
0 голосов
/ 24 марта 2020

Я хотел бы сгенерировать случайную матрицу MxN, где в каждой строке есть только одна строка в случайной позиции. Например, я хотел бы такую ​​матрицу:

Out[3]: 
array([[1, 0, 0],
       [0, 1, 0],
       [0, 1, 0],
       [1, 0, 0],
       [0, 0, 1]])

Я пытался с

M = 5
N = 3
arr = np.array([1]   + [0] * (N-1)) 
arr = np.tile(arr,(M,1))
np.random.shuffle(arr) 

Но это дает:

Out[75]: 
array([[1, 0, 0],
       [1, 0, 0],
       [1, 0, 0],
       [1, 0, 0],
       [1, 0, 0]])

1 Ответ

1 голос
/ 24 марта 2020

Может быть более элегантный способ сделать это, но он работает:

def randOne():
    M = 5
    N = 3
    arr = np.zeros((M, N))
    for row in range(M):
        arr[row, np.random.randint(N)] = 1
    return arr


>>> randOne() array([[ 0.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  0.,  1.],
       [ 0.,  1.,  0.],
       [ 1.,  0.,  0.]])

ИЛИ Да, есть более элегантный способ сделать это;)

def randOne2(M=5, N=3): 
    arr = np.zeros((M, N), dtype=np.int8)
    arr[np.arange(M),np.random.randint(0,N,M)] = 1
    return arr


>>> randOne2()
array([[0, 0, 1],
       [1, 0, 0],
       [1, 0, 0],
       [0, 1, 0],
       [1, 0, 0]], dtype=int8)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...