【问题标题】:How to generate a matrix of two number in python如何在python中生成两个数字的矩阵
【发布时间】:2016-12-28 21:51:21
【问题描述】:

假设X 是一个矩阵。以下命令在01 之间随机选择成员(80% 成员为1,其余成员为0)生成一个形状为X 的矩阵。

srng = RandomStreams()    
srng.binomial(X.shape, p=0.8)

问题是如何在1 和另一个数字喜欢2.5 之间制作相似的随机矩阵。换句话说,我需要一个形状为X 的矩阵,随机选择12.5 之间的成员(成员中80%1,其余成员是2.5

【问题讨论】:

    标签: python matrix random theano


    【解决方案1】:

    就像你在平面上画一条穿过 2 点的线

    y = m*x + a
    

    选择ma 使得当x=0 时为区间的下极值,而当x=1 时为另一个极值。

    所以对于区间[a,b]y = (b-a)x + a

    在这种情况下,对于 [1,2.5],a=1 和 m=1.5,但在您的情况下,a 是纯 1 的矩阵。

    也许你的图书馆有一些其他的实用工具可以做到这一点,但是当其他一切都失败时,这总是会起作用的

    【讨论】:

      【解决方案2】:

      这样的事情怎么样?

      import random
      
      def create_matrix(width, height):
          mat = []
          for i in range(height):
              mat.append([]) # create sublist for each height level
              for _ in range(width):
                  # generate a random number in inclusive range [1, 5]
                  random_number = random.randint(1, 5)
                  # 80% chance the number is one of 1, 2, 3, or 4 (arbitrary; could be 1, 3, 4, or 5, just not the entire range)
                  if random_number in {1, 2, 3, 4}:
                      mat[i].append(1)
                  # 20% chance it's 5
                  else:
                      mat[i].append(2.5)
          return mat
      

      一个结果:

      >>> print(create_matrix(10, 10))
      [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [2.5, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 2.5, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 2.5, 2.5], [2.5, 1, 1, 1, 1, 1, 1, 1, 1, 1], [2.5, 1, 1, 1, 1, 2.5, 1, 1, 2.5, 2.5], [1, 2.5, 1, 1, 1, 2.5, 1, 1, 2.5, 1], [1, 1, 1, 2.5, 2.5, 1, 1, 1, 1, 1], [1, 1, 1, 1, 2.5, 1, 1, 1, 2.5, 1], [1, 2.5, 1, 1, 1, 1, 1, 1, 2.5, 1]]
      

      我们可以验证1s 和2.5s 的数量匹配(或非常接近)您指定的比例:

      >>> {number: [val for row in mat for val in row].count(number) for number in {1, 2.5}}
      {1: 82, 2.5: 18}
      

      经过多次迭代,这些比例将分别接近 80% 和 20%。但是随机机会会围绕这些方法产生一些变化。

      请注意,这根本不能确保每一行至少有一个2.5(不知道这是否与您的问题有关)。但这应该会给你一个好的开始。

      【讨论】:

        【解决方案3】:

        你可以用 NumPy 做到这一点:

        import numpy as np
        
        x = np.zeros((3, 4))
        a = np.random.binomial(1, p=0.8, size=x.shape).astype(float)
        a[a==0] = 2.5
        

        现在a 看起来像这样:

        array([[ 1. ,  1. ,  2.5,  1. ],
               [ 1. ,  1. ,  1. ,  2.5],
               [ 1. ,  1. ,  2.5,  1. ]])
        

        行:

        a[a==0] = 2.5
        

        将所有出现的0 替换为2.5

        【讨论】:

          【解决方案4】:

          如果您不希望直接生成具有 2.5 个值的矩阵,您可以手动替换 0 个值:

          srng = RandomStreams()    
          A = srng.binomial(X.shape, p=0.8)
          A[A == 0]=2.5
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-03-09
            • 1970-01-01
            • 2023-03-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-09-18
            相关资源
            最近更新 更多