我试图创建这样一个对称矩阵,每个区域的元素密度不同。
矩阵是256x256
,在1级,我有16个正方形,长度16,每个有10个元素:
#LEVEL I
C = np.zeros((256,256))
s = 0
for k in range(16):
if k > 0:
s += 16
while m < 10: #number of elements in most inner square
i,j = np.random.randint(s,s+16,size=2) # randint(low,high,size)
C[i,j] = C[j,i] = 1
m = 0.5 * np.sum(C[s:s+16,s:s+16]) # count the number of elements
在第二层,我有4个长64的正方形,每个正方形有4个元素,除了小正方形内的元素(4个正方形每10个元素+4个大正方形元素)。
对于级别2,我需要创建整数随机数,不与小正方形重叠。
#LEVEL II
s = 0
for k in range(4):
if k>0:
s += 64
while m < (40+4):
# create i,j with no overlapping with small squares
C[i,j]=C[j,i] = 1
m = 0.5 * np.sum(C[s:s+64,s:s+64])
我很感激你的任何想法和评论。
#编辑
我认为一个解决方案可以是定义另一个方阵,子方阵都是aij=1,并比较每个while循环中元素的数量。
最佳答案
import numpy as np
# Matrix size and inner squares length
s = 256
L2 = 64
L1 = 16
# Create matrix and masks along MAIN diagonal
C = 1 - np.random.random((s, s))
L2_mask = np.array([range(s)]*s)//L2 + np.array([range(s-1, -1, -1)]*s).T//L2
L1_mask = np.array([range(s)]*s)//L1 + np.array([range(s-1, -1, -1)]*s).T//L1
# Fill in inner squares
C[np.where(L2_mask == 3)] = np.random.randint(2, 10, 16384)
C[np.where(L1_mask == 15)] = np.random.randint(100, 200, 4096)
要生成对称矩阵,我可以建议两种方法:
# Turn matrix into symmetric
C_symm = (C + C.T)//2
或
# Turn matrix into symmetric
C_symm = np.tril(C) + np.tril(C, -1).T
现在把它翻过来:
# Flip it
C_final = np.fliplr(C_symm)