Я хочу создать случайную диагональную матрицу с размером n, чтобы каждый элемент в диагональных элементах имел 50% -ную вероятность быть -1 и 50% -ную вероятность быть 1. Есть ли какой-нибудь совет для этого?

import numpy as np
diagonal_entries = np.random.randint(low = -1, high = 1, size = n)
D = np.diag(diagonal_entries)

Однако проблема в том, что `np.random.randint также содержит 0 в качестве значения. Я хочу только -1 и 1, исключая 0.

2
Jun Jang 25 Фев 2018 в 19:54

3 ответа

Лучший ответ

Вы можете использовать np.random.choice для выборки вектора

import numpy as np
n=100
vec=np.random.choice([-1,1],n)
mat=np.diag(vec)
2
Dinesh 25 Фев 2018 в 17:04

Вы можете объединить несколько подпрограмм NumPy для краткой подпрограммы, которая делает это:

def random_diagonal(n, proba_minus=0):
    diagonal = np.ones(n)
    diagonal[np.random.random(size=n) < proba_minus] = -1
    return np.diagflat(diagonal)

Случайная процедура позволяет вам определить вероятность наличия «-1», а процедура np.diagflat создает диагональную матрицу из ее диагонали. Обе операции выше векторизованы, но для больших размеров вам, конечно, нужно знать, что существует временный массив для логической маски.

0
Pierre de Buyl 25 Фев 2018 в 17:02

Как насчет чего-то вроде этого:

import numpy as np

diagonal_entries = np.random.randint(low = 0, high = 2, size = 4)
print diagonal_entries
# i*2-1 will map [0,1] -> [2*0-1 == -1, 2*1-1 == 1] == [-1,1]
modified = [i*2-1 for i in diagonal_entries] 
D = np.diag(modified)
print D

Я использовал ту же функцию с небольшой модификацией результатов, чтобы удовлетворить ваши [-1,1] потребности.

Моя опция 2nd будет такой modified = [1 if i == 1 else -1 for i in diagonal_entries]

0
CIsForCookies 25 Фев 2018 в 17:23