Python:矢量化/广播会提高速度吗?

标签 python loops numpy vectorization array-broadcasting

目标:合并数组 p1 到 p10 以创建一个名为“a”的大数组,并返回“a”中出现 4 次的所有值。

问题:由于要完成所有循环,此代码非常慢,如何才能使其更快?矢量化和/或广播是否有助于提高效率(是否可以摆脱所有循环)?或者任何其他开箱即用的快速想法?

import numpy as np
import itertools
from numba import jit

p1 = np.random.randint(0,314000,200000)
p2 = np.random.randint(0,314000,100000)
p3 = np.random.randint(0,314000,300000)
p4 = np.random.randint(0,314000,150000)
p5 = np.random.randint(0,314000,220000)
p6 = np.random.randint(0,314000,320000)
p7 = np.random.randint(0,314000,212100)
p8 = np.random.randint(0,314000,100500)
p9 = np.random.randint(0,314000,300700)
p10 = np.random.randint(0,314000,200300)

@jit
def count(a,n):
 counters=np.zeros(10**6,np.int32)
 for i in a:
  counters[i] += 1
 res=np.empty_like(counters)
 k = 0    
 for i,j in enumerate(counters):
  if j == n:
   res[k] = i
   k += 1
 return res[:k]        


for t in range(0, 20000):
 a = itertools.chain(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10)
 count(a,4)

最佳答案

是的,是的。您可以摆脱循环,这会加快速度:

>>> a = np.concatenate([p1,p2,p3,p4,p5,p6,p7,p8,p9,p10])
>>> np.flatnonzero(np.bincount(a, minlength=314000)==4)
array([    29,     33,     38, ..., 313944, 313949, 313973])

关于Python:矢量化/广播会提高速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49798451/

相关文章:

python - 模型的 Django 评级 CommandError

python - 如何以 block 的形式迭代列表

python - 如何将numpy数组转换为元组

python - 如何创建一个 MxN 的 scipy 矩阵,其中 M 和 N 由用户决定,并且元素依次输入?

python - 应用于像素值时,相同的数学和 numpy 函数不会给出相同的结果

Python 导入错误 : cannot import name __version__

python - 比较不同列表python中的元素

python - 更改 Plotly TreeMap 中边框的宽度

java - 我怎样才能根据用户输入使这个抛硬币模拟工作? eclipse

Python 如何将嵌套的 for 循环放入函数中?