【问题标题】:From for loops to numpy dot implementation从 for 循环到 numpy dot 实现
【发布时间】:2011-05-31 21:05:05
【问题描述】:
N=100 

reliab=zeros((N,N))


for i in range(N):    

    for j in range(N):
        if random() < 0.6:
            reliab[i,j] = 1
        else:
            reliab[i,j] = 0

在我的代码中,这个矩阵填充被调用了很多次,这些 for 循环应该用点积来改变......但我不知道该怎么做...... 有人愿意帮助我吗?

【问题讨论】:

    标签: python loops numpy


    【解决方案1】:

    我不确定我是否完全理解您的问题,但以下行应该与您的代码执行相同的操作:

    reliab = numpy.int32(numpy.random.rand(N,N) < 0.6)
    

    【讨论】:

      【解决方案2】:
      >>> import numpy as np
      >>> reliab = np.random.random((N,N))
      >>> reliab = reliab < 0.6
      >>> reliab.dtype = np.int8
      >>> reliab
      array([[0, 0, 0, ..., 1, 0, 1],
             [0, 1, 1, ..., 0, 1, 0],
             [1, 1, 0, ..., 1, 0, 1],
             ..., 
             [0, 1, 0, ..., 1, 1, 1],
             [0, 0, 1, ..., 1, 1, 1],
             [0, 1, 0, ..., 0, 0, 0]], dtype=int8)
      

      【讨论】:

      • 不错。您可能应该在更改其类型之前缩放 reliab。 OP 希望以 0.6 的概率分配 1。
      • @Amaç Herdağdelen:np.random.random 在[0,1) 的区间上,因此不需要缩放。 (或者对我的数组求和,我从 10000 中得到 6009,这几乎是 60%)。 (是的,你确实打败了我,它们很相似,但我想我还是会写完答案)。
      • 对不起,我看到了您的答案的早期版本,其中不包括“
      • 太棒了!非常感谢大家!
      猜你喜欢
      • 2018-09-21
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2020-02-08
      相关资源
      最近更新 更多