python numpy 随机构建类无向图邻接矩阵

不能保证能各个节点之间能完全走通,只是记录一下。

import numpy as np

def structMatrix(n=11, low=1, high=10, num_base=10, num_more=10):
    """
    构建无向图邻接矩阵
    :param n:       矩阵是 n x n 状的
    :param low:     矩阵中每个位置数值的大小下限
    :param high:    矩阵中每个位置数值的大小上限
    :param num_base:要替换的数量下限
    :param num_more:要替换的数量增加值(下限 + 增加值 = 上限,下限 + 增加值*random = 要替换的数量确定值)
    :return:
    """
    # k = np.random.rand()
    X_ = np.random.randint(low=low,high=high,size=n**2).reshape(n,n).astype(float)    # 先造一个n*n的浮点矩阵(整数型矩阵无法放np.inf)
    # 在行索引中随机选择num_base到num_base+num_more个(如10到10+10个)用于后面替换成np.inf(因为可能有大量重复,所以你可以设的base和more都可以大些)
    index_0 = np.random.choice(X_.shape[0], int(num_base + num_more * np.random.rand()))
    print(f"index_0={index_0}")
    # 在列索引中随机选择num_base到num_base+num_more个(如10到10+10个)用于后面替换成np.inf(因为可能有大量重复,所以你可以设的base和more都可以大些)
    index_1 = np.random.choice(X_.shape[1], int(num_base + num_more * np.random.rand()))
    print(f"index_1={index_1}")


    # 将行列索引组合起来,每次根据一个行座标和一个列座标确定一个座标,对应元素设置为np.inf
    print("下面是初次选中的座标:")
    for (i,j) in list(zip(index_0, index_1)):
        print((i,j))
        # 如果在对角线上就不替换了,因为对角线上应该是0的(或者你可以设置1e-4这种很小的数,这取决于你的程序)
        if i == j:
            continue
        X_[i,j] = np.inf

    X_ = np.triu(X_)                          # 得到原X的上三角矩阵(含对角线),下三角清零
    X_ += X_.T - 2*np.diag(X_.diagonal())      # X.diagonal()提取对角线,np.diag()构造对角线矩阵,再减去该2倍对角线矩阵得对角线为0的矩阵
    return X_

print(f"结果矩阵:\n{structMatrix()}")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章