python - 使 np.sums 的 for 循环运行得更快的方法

标签 python arrays numpy

我有这段代码,它迭代矩阵列表,获取它们的 np.sum 并对变量进行加/减。 这段代码是我正在处理的一个更大的模拟问题的一部分,由于每次运行整个程序时这段小代码都会运行大约 10mi+ 次,所以我试图使其尽可能高效。 有什么办法可以简化这个过程,使其运行得更快吗?我寻找了一些矢量化技巧,但没有发现如何提高效率

#mi could be of any size
mi = np.random.randint(2,size=(4,4))
#the arrays in list_of_blocks could be of any size so the np.sum of the list would end in a ValueError
list_of_blocks = [np.array([[0],[1]]),np.array([[0,0,0],[0,1,0]])]
nee = np.sum(mi)
n1 =0
mrxnr= 0
for block in list_of_blocks:
    nee -= np.sum(block)
    n1 += np.sum(block)
    mrxnr += block.shape[0]*block.shape[1]

最佳答案

矢量化的工作原理是对 numpy 数组应用一些操作,这些数组的数据存储在连续的内存块中。列表的情况并非如此,因此循环对于这种情况似乎没问题。

但是,您的代码中有一些内容需要优化。 list_of_blocks 中的数组总是 01 吗?如果是这种情况,count_nonzerosum 快得多。

此外,block.shape[0]*block.shape[1] 相当于 block.size,速度也更快。

最后,neen1 是相关的,因此不需要计算 sum(block) 两次 对于每个循环周期。优化后的代码:

nee = np.sum(mi)
n1 =0
mrxnr= 0
for block in list_of_blocks:
    n1 += np.count_nonzero(block)
    mrxnr += block.size
nee -=n1

关于python - 使 np.sums 的 for 循环运行得更快的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58151188/

相关文章:

python - 如何在 numpy/scipy 中按行计算矩阵?

python - 使用 argparse 错误地传递参数

python - 检查我对哈希表的理解

javascript - 如何在 ReactJS 中将列表中的值存储到对象数组中

java - 让元素粘在java中的数组中(模拟书店项目)

python - Numpy 计算中间的值

python - 在 python 中通过引用或值处理数据

python - SpaCy 中的 .pos_ 在 Python 中不返回任何结果

python - 如何在 Python 中以矢量化方式将具有两个标签 +1 和 -1 的数据集转换为热矢量表示?

c++ - 使用 O(1) 空间重新映射数组