当前位置: 首页 > 面试题库 >

有效生成numpy.random.choice的多个实例而无需替换

宦源
2023-03-14
问题内容

我是Python的新手。阅读时,请提及有关改进我的Python代码的其他建议。

问题: 如何在Python中生成包含随机数的8xN维数组? 约束条件是此数组的每一列必须包含8个抽奖,而不能从整数集[1,8]中进行替换
。更具体地说,当N = 10时,我想要这样的东西。

[[ 6.  2.  3.  4.  7.  5.  5.  7.  8.  4.]
 [ 1.  4.  5.  5.  4.  4.  8.  5.  7.  5.]
 [ 7.  3.  8.  8.  3.  8.  7.  3.  6.  7.]
 [ 3.  6.  7.  1.  5.  6.  2.  1.  5.  1.]
 [ 8.  1.  4.  3.  8.  2.  3.  4.  3.  3.]
 [ 5.  8.  1.  7.  1.  3.  6.  8.  1.  6.]
 [ 4.  5.  2.  6.  2.  1.  1.  6.  4.  2.]
 [ 2.  7.  6.  2.  6.  7.  4.  2.  2.  8.]]

为此,我使用以下方法:

import numpy.random
import numpy
def rand_M(N):
    M = numpy.zeros(shape = (8, N))
    for i in range (0, N):
        M[:, i] = numpy.ranhtml" target="_blank">dom.choice(8, size = 8, replace = False) + 1 
    return M

实际上,N将为〜1e7。上面的算法在时间上为O(n),当N = 1e3时大约需要0.38秒。因此,N =
1e7的时间约为1小时(即3800秒)。必须有一种更有效的方法。

定时功能

from timeit import Timer 
t = Timer(lambda: rand_M(1000))
print(t.timeit(5))
0.3863314103162543

问题答案:

创建一个指定形状的随机数组,然后沿要保留限制的轴进行排序,从而为我们提供了矢量化且非常有效的解决方案。这将在此基础上smart answer 对MATLAB randomly permuting columns differently。这是实现-

样品运行-

In [122]: N = 10

In [123]: np.argsort(np.random.rand(8,N),axis=0)+1
Out[123]: 
array([[7, 3, 5, 1, 1, 5, 2, 4, 1, 4],
       [8, 4, 3, 2, 2, 8, 5, 5, 6, 2],
       [1, 2, 4, 6, 5, 4, 4, 3, 4, 7],
       [5, 6, 2, 5, 8, 2, 7, 8, 5, 8],
       [2, 8, 6, 3, 4, 7, 1, 1, 2, 6],
       [6, 7, 7, 8, 6, 6, 3, 2, 7, 3],
       [4, 1, 1, 4, 3, 3, 8, 6, 8, 1],
       [3, 5, 8, 7, 7, 1, 6, 7, 3, 5]], dtype=int64)

运行时测试-

In [124]: def sortbased_rand8(N):
     ...:     return np.argsort(np.random.rand(8,N),axis=0)+1
     ...: 
     ...: def rand_M(N):
     ...:     M = np.zeros(shape = (8, N))
     ...:     for i in range (0, N):
     ...:         M[:, i] = np.random.choice(8, size = 8, replace = False) + 1 
     ...:     return M
     ...:

In [125]: N = 5000

In [126]: %timeit sortbased_rand8(N)
100 loops, best of 3: 1.95 ms per loop

In [127]: %timeit rand_M(N)
1 loops, best of 3: 233 ms per loop

因此,等待 120x 加速!



 类似资料:
  • @refreshscope和/refresh不能用于更新多个服务实例我知道这可以使用spring cloud bus来完成,但由于一些限制,我不能选择这一点,还有其他选择吗

  • 我正在将Vue集成到一个表单网站上,这意味着如果页面上有多个表单,我必须创建Vue应用程序的几个实例。所有实例共享相同的Vuex存储。 我创建了一个Vuex模块,这样每个Vue实例都可以有自己的本地状态。我的主要目标是防止一个Vue实例更新另一个Vue实例的状态。 这是我的Vuex模块 创建我的Vuex实例: 我正在阅读Vuex文档,它说你需要使用一个返回模块状态的函数,这就是我正在做的。但是,当

  • 我有几个不同的单词需要使用Javascript替换为不同的单词。我想我可以使用replace函数来实现这一点,但它似乎只在第一次调用时起作用。 然而,由于我需要替换的单词彼此相似,这导致了某种问题,我不知道如何修复它。我还真的需要用Javascript而不是jQuery来做这件事。谢了。 例:

  • 我正在尝试创建2个不同上下文的Swagger实例: http://localhost:8080/app/rest1/swagger.json web.xml 问题是,第二个URL http://localhost:8080/app/rest2/Swagger.JSON生成一个JSON,所有endpoint都在第一个Swagger配置的包下(所以在下,而不是)。 你能帮我弄个正确的配置吗? 谢谢

  • 问题内容: 我的桌子上有一个方程式。我一次要提取一个方程式,并希望将所有运算符替换为其他任何字符。 输入字符串: 运算符或模式: 替换字符: 输出字符串: 我曾尝试使用 嵌套的REPLACE 函数在下面的查询中得到所需的输出: 输出: 如何在不使用嵌套替换功能的情况下替换所有运算符? 问题答案: 我创建了一个函数来实现此目的,因为我需要多次执行此操作 分割功能 过程中使用的代码: 输出

  • 这是一个游戏,当用户点击左侧div的最后一个节点时,每次都会添加5个图像。 如果他点击其他节点,应该显示游戏结束警报。 问题: > 在调用Generateface函数生成新面孔集之前,我将如何删除右侧和左侧div的所有节点。 点击左边额外的笑脸

  • 我有一个使用两个数据源(db2和sql-server)的Hibernate的Spring项目。 我一加上 在创建sql-server时,我会得到一个,因为不支持序列。但是,该实体唯一被使用的地方是在使用db2的DAO中,而db2使用了适当的方言。 我错过了什么?

  • 问题内容: 有没有办法绕过python中的类的构造函数? 例: 现在,我想创建一个实例。看起来可能像这样,但是这种语法不正确。 编辑: 一个更复杂的示例: 假设我有一个对象,目的是存储一个参数并对其进行一些计算。但是,该参数并未按原样传递,而是被嵌入到巨大的参数文件中。它可能看起来像这样: 现在,我想转储并加载该对象的实例。但是,在加载该对象时,我只有一个变量,并且无法调用构造函数,因为它需要参数