Как установить сумму каждой строки в массиве, равную 1? - PullRequest
0 голосов
/ 04 марта 2020

Я не уверен, что мне нужно для l oop, чтобы каждая строка была равна 1? Я пытаюсь сделать двумерный массив со случайными целыми числами, где сумма каждой строки равна 1.

import numpy as np

a = np.random.randint(1,2, size = (13,17))

Ответы [ 3 ]

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

Единственный способ получить двумерный массив натуральных чисел со строками, сумма которых равна 1, - это если каждая строка содержит все нули и один. Это можно сделать, используя что-то вроде этого

import numpy as np

# get 2D array of zeros
a = np.zeros((13, 17)).astype(int)

# loop over each row
for row in range(len(a)):
    # place a one at a random index in each row
    idx = np.random.choice(len(a[0]))
    a[row, idx] = 1

print(a)

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

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

"Создайте двумерный массив случайных положительных записей 13 на 17 так, чтобы сумма каждой строки была равна 1."

Если записи должны быть целыми числами, как вы пишете в своем вопросе, то

a = np.zeros((13,17), dtype=np.uint8)
a[np.arange(13), np.random.randint(0,13, size=13)] = 1

В противном случае:

a = np.random.randint(0, 10, size = (13,17))  # instead of 10 you can use any value >= 2
a = a / a.sum(1, keepdims=True)

# Check
a.sum(1)
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
0 голосов
/ 04 марта 2020

Если вам нужны положительные числа (не целые числа), то создайте свою матрицу как случайные числа от 0 до 1 и нормализуйте каждую строку:

a = np.random.rand(17,12)
a = a/np.linalg.norm(a, ord=2, axis=1, keepdims=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...