如何生成隨機 (N*M) 0 和 1 矩陣,其中每行的總和等于 10?(在 python 中使用 numpy)
例如對于10*10(N*M)矩陣我們可以使用:
import numpy as np
np.random.randint(2, size=(10, 10))
但我希望每行的總和等于 10
uj5u.com熱心網友回復:
這不一定是最有效的方法,但它很簡潔:
In [29]: rng = np.random.default_rng(121263137472525314065)
In [30]: n_rows = 5
In [31]: n_cols = 20
In [32]: n_ones = 10
In [33]: rng.multivariate_hypergeometric([1]*n_cols, n_ones, size=n_rows)
Out[33]:
array([[0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1],
[1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0],
[0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1],
[0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1],
[1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0]])
uj5u.com熱心網友回復:
或者,分配 0 和 1 的陣列并隨機排列每一行:
import numpy as np
n_rows = 5
n_cols = 20
n_ones = 10
arr = np.tile(np.repeat([0, 1], [n_ones, n_cols-n_ones]), (n_rows,1))
# [[0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1]
# [0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1]
# [0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1]
# [0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1]
# [0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1]]
np.apply_along_axis(np.random.shuffle, 1, arr) # operates on arr inplace
# [[1 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 1 1]
# [1 0 1 1 0 1 1 0 0 0 1 0 1 0 1 1 0 0 1 0]
# [1 1 0 1 0 0 0 1 0 0 1 1 0 0 1 0 1 1 1 0]
# [1 0 0 1 0 0 0 1 0 0 1 1 0 1 1 0 1 0 1 1]
# [1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 0 0]]
uj5u.com熱心網友回復:
你可以為每一行隨機抽取 10 個索引
def make_thing(n):
if n <= 10:
return np.ones((10,10))
matrix = np.zeros((n, n))
for row in range(n):
ten_random_index = random.sample(range(n),10)
matrix[row][ten_random_index] = 1
return matrix
或者你可以預定義一行
row = [1]*10 [0]*(n-10)
matrix = numpy.array([random.sample(row,n) for _ in range(n)])
uj5u.com熱心網友回復:
您可以使用下面的函式來獲得一個包含 1 和 0 且行總和等于 10 的隨機矩陣:
def matrix_generator(n_rows, n_columns):
if n_columns < 10:
print('Number of rows need to be greater than or equal to 10.')
return 0
row_list = [1,1,1,1,1,1,1,1,1,1]
add_columns = n_columns-10
for i in range(add_columns):
row_list.append(0)
matrix = [[]]*n_rows
for i in range(n_rows):
random.shuffle(row_list)
matrix[i] = row_list[:]
random.shuffle(matrix)
return matrix

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/533460.html
上一篇:加權重采樣一個numpy陣列
