【问题标题】:Generate a matrix without 0 values in a random way以随机方式生成没有0值的矩阵
【发布时间】:2019-08-23 14:56:09
【问题描述】:

我正在尝试在区间 [-5,-1] 和 [1,5] 中以随机方式创建一个矩阵。如何创建一个考虑随机值的区间(无 0 值)的矩阵?

我尝试使用 numpy 的 randintpiecewise 来实现。在第一种情况下不可能指示 2 个区间,而在第二种情况下,当值接近 0(大于 -1 且小于 1)时生成的随机数始终相同。

    x=np.random.randint(-5,5,(2,3))
    np.piecewise(x, [x <= 1, x >=-1 ], [np.random.randint(-5,-1), np.random.randint(1,5)])

我想以这种方式有一个没有 0 值的矩阵:

  [-2,-3,-1
    1,-2, 3]

【问题讨论】:

  • 您是否考虑将 random.randrange( ... ) 与一些额外的 numpy 数组选项一起使用?

标签: python python-3.x random


【解决方案1】:

一种选择是将值 0 简单地“重新映射”到边界之一:

import numpy as np

np.random.seed(100)
x = np.random.randint(-5, 5, (4, 8))
x[x == 0] = 5
print(x)
# [[ 3  3 -2  2  2 -5 -1 -3]
#  [ 5 -3 -3 -3 -4 -5  3 -1]
#  [-5  4  1 -3 -1 -4  5 -2]
#  [-1 -1 -2  2 -4 -4  2  2]]

或者你可以使用np.random.choice:

import numpy as np

np.random.seed(100)
np.random.choice(list(range(-5, 0)) + list(range(1, 6)), size=(4, 8))
print(x)
# [[ 3  3 -2  2  2 -5 -1 -3]
#  [ 5 -3 -3 -3 -4 -5  3 -1]
#  [-5  1 -3 -1 -4  5 -2 -1]
#  [-1 -2  2 -4 -4  2  2 -5]]

【讨论】:

  • 请记住,第一个解决方案会使分布不均匀!
  • @fulaphex 是吗?为何如此?不是所有 10 个值都具有相同的被选中概率吗?
  • 抱歉,我看错了 randint 函数的界限。但是我觉得还是有错误,我觉得应该是x = np.random.randint(-5, 5, (4, 8))。从文档中,高值比要绘制的最大整数高一。
【解决方案2】:

您可以创建一个随机正矩阵并将其逐个元素乘以一个随机符号:

np.random.randint(1,6,(2,3))*np.random.choice([-1,1],(2,3))

请记住,这仅在间隔甚至在 0 左右时才有效,例如(-6,6)0 除外)。

【讨论】:

    【解决方案3】:
    import numpy as np
    a = np.arange(-5,6)
    np.random.choice(list(numpy.select([a != 0, a == 0], [a, -1])),(5,5))
    

    这是您可以定义自己的列表条件的另一种方式。您可以通过编辑条件从数组“a”中省略任何数字。在上面等于零的数字返回-1,对于不等于零的数字返回相同的数字。

    【讨论】:

    • 谢谢,但这只会在区间之间创建一个随机数,但我需要一个矩阵
    【解决方案4】:
    np.random.choice(list(range(-5,0))+list(range(1,6)),(5,5))
    

    a = list(range(-5,6))
    a.remove(0)
    np.random.choice(a,(5,5))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-30
      • 2018-10-26
      • 2018-08-11
      • 2015-06-27
      • 1970-01-01
      • 2019-10-29
      • 2019-10-14
      • 2017-03-26
      相关资源
      最近更新 更多