【问题标题】:Producing binary matrix with random lists使用随机列表生成二进制矩阵
【发布时间】:2020-03-16 10:33:54
【问题描述】:

所以首先这里是我的代码我有疑问,我觉得答案很简单,但我太盲目了,看不到它

dic = {}

for i in range(0,9):
    dic['rand_num{0}'.format(i)] = np.sort(random.sample(range(0,8),5))

mat = np.zeros([8,8])


for rand_num in dic.values():
    print(rand_num)
    for i in range(0,5):
        matrixval = rand_num[i]
        #print(matrixval)
        for j in range(0,8):
            mat[matrixval,j] = 1


print(mat)


我创建了 8 个不同的列表,这将帮助我确定在矩阵中设置 1 的位置。

例如。如果我的第一个列表如下所示:

rand_List = [0,3,5,6,7]

第一行或第一列的矩阵应该是这样的

矩阵 = [1, 0, 0, 1, 0, 1, 1, 1]

我在第二个循环中设置矩阵值的位置:for i in range(0,5): matrixval = rand_num[i]。但是,一旦我运行我的代码,我的矩阵只会给我一个而不是一个和零。我觉得我在最后一个 for 循环中遇到了迭代问题,我不知道如何解决它。

如果有人可以帮助我,或者只是给我一个提示,如何真正解决我这个有希望的小错误,我将不胜感激。

【问题讨论】:

  • matrix = [int(x in rand_list) for x in range(9)].
  • 对于一个完全随机的二进制矩阵你可以试试:np.random.randint(0, 2, 8*8).reshape(8,8)
  • @pault 好主意 +1 -- 会提到,randint 有一个 size 参数,这使得 .reshape 过时了。在下面查看我的答案。

标签: python list numpy loops dictionary


【解决方案1】:

希望这能提供预期的结果:

dic = {}

for i in range(0,8):
    dic['rand_num{0}'.format(i)] = np.sort(random.sample(range(0,8),5))

mat = np.zeros([8,8])

for j, rand_num in enumerate(dic.values()):
    print(rand_num)
    for i in range(0,5):
        matrixval = rand_num[i]
        mat[j,matrixval] = 1

print(mat)

输出:

[1 2 3 5 7]
[0 1 2 5 6]
[0 1 2 3 5]
[1 2 3 4 6]
[0 1 3 4 7]
[1 2 4 5 7]
[0 1 3 4 7]
[1 2 3 4 6]
[[0. 1. 1. 1. 0. 1. 0. 1.]
 [1. 1. 1. 0. 0. 1. 1. 0.]
 [1. 1. 1. 1. 0. 1. 0. 0.]
 [0. 1. 1. 1. 1. 0. 1. 0.]
 [1. 1. 0. 1. 1. 0. 0. 1.]
 [0. 1. 1. 0. 1. 1. 0. 1.]
 [1. 1. 0. 1. 1. 0. 0. 1.]
 [0. 1. 1. 1. 1. 0. 1. 0.]]

【讨论】:

    【解决方案2】:

    不需要您使用的dic。这是一个没有它的解决方案。

    import random
    
    lists = []
    for i in range(0, 9):
        lists.append(sorted(random.sample(range(0, 8), 5)))
    
    mat = []
    for lst in lists:
        arr = [0] * 8
    
        for index in lst:
            arr[index] = 1
    
        mat.append(arr)
    
    print(mat)
    

    输出:

    [[0, 1, 1, 0, 0, 1, 1, 1],
     [1, 0, 1, 1, 0, 0, 1, 1],
     [1, 1, 1, 1, 0, 0, 0, 1],
     [0, 1, 1, 1, 0, 1, 1, 0],
     [1, 1, 0, 1, 1, 0, 1, 0],
     [1, 0, 1, 1, 0, 1, 1, 0],
     [0, 1, 1, 1, 1, 1, 0, 0],
     [0, 1, 1, 0, 1, 1, 1, 0],
     [1, 0, 1, 0, 1, 0, 1, 1]]
    

    您也可以使用numpy.random.randint 来生成您的二进制二维数组。

    import numpy as np
    
    arr = np.random.randint(2, size=(8, 8))
    print(arr)
    

    输出:

    [[1 0 1 0 1 0 1 1]
     [0 0 0 0 1 0 1 1]
     [1 0 1 1 0 0 1 1]
     [1 1 0 1 0 1 1 0]
     [0 0 1 0 0 1 1 1]
     [1 0 0 0 1 1 1 1]
     [1 1 0 1 0 0 1 1]
     [1 0 1 0 0 1 0 0]]
    

    【讨论】:

    • 谢谢,我没想过,绝对是另一种解决方法!
    • 有时最好不要重新发明轮子。
    猜你喜欢
    • 2015-11-26
    • 2020-08-31
    • 2022-01-03
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 2017-04-30
    • 2016-06-30
    • 1970-01-01
    相关资源
    最近更新 更多