python - 计算每个指数平均值的最快方法

标签 python arrays performance numpy scipy

我有两个形状相同的二维数组:given_array 和 reference_array。我必须为 reference_array 计算平均值的每个唯一值编写一个文件,其中唯一值位于给定数组中。

import numpy as np

given_array = np.array([[2,4,5,8,9,11,15],[1,2,3,4,5,6,7]])

reference_array = np.array([[2,2,2,8,8,8,15],[2,2,2,4,8,8,9]])

unique_value = np.unique(reference_array)

file_out = open('file_out', 'w')

for unique in unique_value:
    index = reference_array == unique
    mean = np.mean(given_array[index])
    file_out.write(str(unique) + ',' + str(mean) + '\n')

file_out.close()

上面的代码有效,但在我的实际问题中,从光栅图像读取的两个数组非常大,需要几天时间才能完成处理。

如果有人能提供产生相同结果的最快方法,将不胜感激。

最佳答案

只遍历数组一次可能会更快,即使它使用纯 python:

from collections import defaultdict
from itertools import izip

add = lambda (sum_, count), value: (sum_+value, count+1)
unique = defaultdict(lambda:(0,0))
for ref, value in izip(reference_array.flat, given_array.flat):
    unique[ref] = add(unique[ref], float(value))

with open('file.out', 'w') as out:
    for ref, (sum_, count) in unique.iteritems():
        out.write('%f,%f\n' % (ref, sum_ / count))

与 OP 的解决方案相反,查找唯一值和计算平均值是在一个循环中完成的。 unique 是一个字典,其中键是一个引用值,值是一对具有相同引用值的所有给定值的总和和计数。循环后,不仅将所有唯一引用值放入字典 unique 中,还将所有给定元素排序为它们的引用值作为 sum 和 count,这可以很容易地用于计算平均值第二步。

问题的复杂性从 size_of_array * number_of_unique_values 降低到 size_of_array + number_of_unique_values

关于python - 计算每个指数平均值的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27087455/

相关文章:

objective-c - 需要一种更高效的方法来将大量 float 存储到数组中并将它们读回

javascript - 在 Javascript 中查找最接近所需值的数组条目?

MySQL 向大表中添加一列的性能

c++ - 分配更多内存会减慢操作速度?

java - 检查连接速度的库

python - 如何使用 Python/GAE 获取当前域名?

python - QTableWidget - 改变行颜色

javascript - 将数据从 Django View 获取到 JS 以在页面上执行的最佳实践?

Python pytest pytest_exception_interact 从VCR.py异常自定义异常信息

arrays - Swift 3 二维 Int 数组