【问题标题】:how do I produce unique random numbers as an array in Python?如何在 Python 中生成唯一的随机数作为数组?
【发布时间】:2019-11-20 00:12:21
【问题描述】:

我有一个大小为 (4,4) 的数组,它的值可以是 0 和 1,所以我可以有 65536 个不同的数组。我需要生成所有这些数组而不重复。我使用wt_random=np.random.randint(2, size=(65536,4,4)),但我担心它们不是唯一的。你能告诉我这段代码是否正确,我应该怎么做才能产生所有可能的数组?谢谢。

【问题讨论】:

  • 如果您需要唯一值,我建议您创建数据结构并用递增的整数填充它。此后,开始随机洗牌。
  • 这是什么意思?我需要在 python 中生成只有 0 或 1 的 4x4 数组。增加整数是什么意思?我必须用 0 或 1 而不是其他数字填充它。我想知道有什么办法可以产生这些65536个唯一的数组吗?
  • 问题与keras 无关 - 请不要向无关标签发送垃圾邮件(已删除)。

标签: python arrays numpy random


【解决方案1】:

你可以使用numpy.meshgrid

output = np.array(np.meshgrid(*[[0,1] for _ in range(16)])).T.reshape(-1, 4,4)

因为您需要获取所有可能的值(可能值的数量 = 2 ^16 = 65536)

【讨论】:

  • 您的建议也是正确的。谢谢。
  • 有什么方法可以同时选择两个提议的代码作为答案吗?
  • 有什么办法可以洗牌这个最终的数组吗?例如,第一个 4x4 数组全为 0,最后一个全为 1。有什么办法可以重新排序吗?
  • 不,别担心@david,我很高兴能帮上忙。你可以做np.random.shuffle(output)
【解决方案2】:

您可以使用itertools.productrepeat=16 生成所有模式,然后将它们重新整形为(4,4)

试试这个:

import numpy as np
from itertools import product

wt_random = np.array([np.array(p).reshape((4, 4)) for p in product((0, 1), repeat=16)])
np.random.shuffle(wt_random)

print(wt_random.shape)
print(wt_random[1234])

输出:(显示形状正确,以及示例元素)

(65536, 4, 4)
[[0 0 0 0]
 [0 1 0 0]
 [1 1 0 1]
 [0 0 1 0]]

【讨论】:

【解决方案3】:

您可以遍历从 1 到 65535 的 n,然后将二进制等价物映射到您的数组,这将是最简单且 100% 真正唯一且包括所有可能性的数组。

例如 m1->0 : [ [0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0] ] 对于 m2->1 : [ [0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,1] ]

     ----------------------------------------------------
     -----------------------------------------------   upto n

对于 m65536->65535 : [ [1,1,1,1], [1,1,1,1], [1,1,1,1], [1,1,1,1] ]

【讨论】:

  • 这很耗时:(有没有办法使用python中的内置函数来生成所有这些?
  • 我建议你使用 bin() 方法为每次迭代转换为二进制,然后可以用于构建数组。此外,如果不需要一次生成所有数组,您可以编写一个返回特定索引数组的函数。 0-65535之间
【解决方案4】:

如果您需要以随机顺序排列所有可能的数组,请考虑以任意确定的顺序枚举它们,然后将它们打乱以使顺序随机化。如果您不希望所有数组都在内存中,您可以编写一个函数以在确定性列表中的给定位置生成数组,然后打乱这些位置。请注意,Fisher-Yates 甚至可能不需要列表的密集表示来洗牌......如果你跟踪已经洗牌的条目最终的位置,你应该有足够的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 2018-10-13
    • 2012-03-14
    • 2010-12-09
    • 2012-06-05
    • 1970-01-01
    相关资源
    最近更新 更多