【问题标题】:Drawing a random number from set of numbers excluding those given in certain sets从一组数字中抽取一个随机数,不包括某些集合中给出的数字
【发布时间】:2016-09-12 01:43:54
【问题描述】:

假设我有两个数组:

import numpy as np
a = np.random.randint(0,10,10)
b = np.random.randint(0,10,10)

我想生成另一个长度为 10 的数组,其第 i 个条目是从集合中抽取的随机整数({0...9} 减去元素 a[i]b[i])。

作为 NumPy 的新手,我认为最简单的方法可能是:

  1. 获取每个i的设置差异x = {0...9} - (a[i] union b[i])
  2. 为每个inp.random.choice(x[i], 1)

但我发现这有点棘手,因为我不知道如何将 setdiff1d 元素映射到 2 个数组。在 NumPy 中是否有一种明显的方法可以做到这一点(即理想情况下不必求助于 Python 集等)?

【问题讨论】:

  • import random random.sample(set(range(0, 10)).difference([a[i], b[i]]), 1)[0]

标签: python numpy


【解决方案1】:

这是一种方法:

In [87]: col = np.array((a, b)).T # Or as a better way np.column_stack((a,b)); suggested by @Divakar

In [88]: r = np.arange(10)

In [89]: np.ravel([np.random.choice(np.setdiff1d(r, i), 1) for i in col])
Out[89]: array([7, 8, 8, 6, 6, 8, 6, 5, 5, 6])

或者作为一种 numpytonic 方法:

In [101]: def func(x):                           
             return np.random.choice(np.setdiff1d(r, x), 1)
   .....: 

In [102]: np.apply_along_axis(func, 1, col).ravel()
Out[102]: array([6, 7, 9, 6, 4, 6, 7, 4, 0, 7])

【讨论】:

  • +1 将向量加载到矩阵中并转置以获得正确的形状。有人可能会说,非常 NumPythonic!
  • 也许使用np.column_stack((a,b))?另外,我不建议使用 np.apply_along_axis 来提高性能,我认为 NumPy 通常是为此而设计的。
  • @Divakar 确实这是一个更好的方法。关于apply_along_axis,我从来没有任何基准测试,但我认为列表理解更快。
  • 同意!事实上,最近我有幸使用benchmark those,我认为apply_along_axis 甚至比天真的循环还要慢。所以,我猜循环理解也可能是首选。
  • @Divakar 我认为apply_along_axis 的本质是用于我们进行大量计算的情况,特别是大型数据集。对于这样的 sn-ps,将数据转换为 numpy 对象的成本对于我们获得的性能来说是非常昂贵的。
【解决方案2】:

np.random.choice 函数似乎不允许同时对多个集合进行操作。因此,您将需要某种形式的循环来为输出的每个元素分别调用np.random.choice。鉴于需要一个循环,我认为没有比您在问题中的建议做得更好的了。以下代码实现了您的想法并通过使用列表推导稍微隐藏了所需的循环:

import numpy as np
a = np.random.randint(0,10,10)
b = np.random.randint(0,10,10)
domain = set(range(10))
res = [ np.random.choice(list(domain - set(avoid))) for avoid in zip(a, b) ]
res = np.array(res)

【讨论】:

    猜你喜欢
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 2013-10-27
    相关资源
    最近更新 更多