【问题标题】:How to generate a numpy array with random values that are all different from each other如何生成具有彼此不同的随机值的numpy数组
【发布时间】:2021-12-25 14:42:33
【问题描述】:

我刚开始学习 Python 库,今天我被困在一个 numpy 练习中。

假设我想生成一个 5x5 随机数组,其值彼此不同。此外,它的值必须在 0 到 100 之间。

我已经在此处查找了此内容,但没有找到适合我的问题的解决方案。转给你之前请看我咨询过的帖子:

这是我解决这个问题的尝试:

import numpy as np

M = np.random.randint(1, 101, size=25)
for x in M:
    for y in M:
        if x in M == y in M:
            M = np.random.randint(1, 101, size=25)
            print(M)

通过这样做,我得到的只是一个值错误:ValueError:具有多个元素的数组的真值是不明确的。使用 a.any() 或 a.all()

因此,我的第二次尝试如下:

M = np.random.randint(1, 101, size=25)
a = M[x]
b = M[y]

for a.any in M:
    for b.any in M:
        if a.any in M == b.any in M:
            M = np.random.randint(1, 101, size=25)
            print(M)

我又遇到了一个错误:AttributeError: 'numpy.int64' object attribute 'any' is read-only.

你能告诉我我做错了什么吗?我已经花了好几天的时间来解决这个问题,但没有想到其他任何事情:(

非常感谢!

【问题讨论】:

  • np.random.random((5,5))*100
  • 关注测试线 - if。这就是问题所在。查看M==y 步骤。对此进行if 测试有意义吗?
  • choice 有什么问题?您正在艰难地进行下去,反复创建值数组,直到满足条件为止。让numpy 为您完成工作。
  • 当错误信息告诉你使用any时,它的意思是(M == b).any()any 是布尔运算,用于处理 True/False 值的数组。对数字的应用没有意义(如a.any())。
  • 非常感谢@hpaulj 的见解,现在我对 any 函数有了更好的理解 :)

标签: arrays numpy random


【解决方案1】:

虽然我认为choice 无需替换是最简单的方法,但这是实现您的方法的一种方法。我用np.unique来测试是不是所有的数字都不一样。

In [158]: M = np.random.randint(1,101, size=25)
In [159]: x = np.unique(M)
In [160]: x.shape
Out[160]: (23,)
In [161]: cnt = 1
     ...: while x.shape[0]<25:
     ...:     M = np.random.randint(1,101,size=25)
     ...:     x = np.unique(M)
     ...:     cnt += 1
     ...: 
In [162]: cnt
Out[162]: 34
In [163]: M
Out[163]: 
array([ 70,  76,  27,  98,  81,  92,  97,  38,  49,   7,   2,  55,  85,
        89,  32,  51,  20, 100,   9,  91,  53,   3,  11,  63,  21])

请注意,我必须先生成 34 个随机集合,然后才能获得唯一的集合。工作量很大!

unique 对数组进行排序,然后查找相邻的重复项。

一个numpy整个数组的方法来测试是否有任何重复是:

对于这个独特的集合:

In [165]: (M[:,None]==M).sum(axis=0)
Out[165]: 
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])

但对于另一个randint 数组:

In [166]: M1 = np.random.randint(1,101, size=25)
In [168]: (M1[:,None]==M1).sum(axis=0)
Out[168]: 
array([1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1,  2, 2, 1])

这个M[:,None]==M大致相当于

for x in M:
    for y in M:
        test x==y

我使用sum 来计算每列中有多少True 值。 any 只是识别是否存在 True。

【讨论】:

    【解决方案2】:

    你可以使用

    np.random.random((5,5))
    

    生成一个从 0 到 1 的随机数数组,形状为 (5,5)。

    然后乘以 100 得到 0 到 100 之间的数字:

    100*np.random.random((5,5))
    

    由于这一行,您的代码会出错:

    if x in M == y in M:
    

    该语法不起作用。而M == y 是一个数组和一个数字之间的比较,这就是为什么你会得到 ValueError: true value of an array with multiple element is ambiguous。使用 a.any() 或 a.all()

    您已经在for 循环中将xy 定义为M 的元素,所以只需编写

    if x == y:
    

    【讨论】:

      【解决方案3】:

      不确定这是否可以满足您的所有需求,但它适用于您的示例:

      np.random.choice(np.arange(100, dtype=np.int32), size=(5, 5), replace=False)
      

      【讨论】:

      • choice without replacement 实际上是他想要的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 2021-03-26
      • 2018-02-20
      • 2018-01-08
      • 1970-01-01
      相关资源
      最近更新 更多