我有两个形状相同的二维数组: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/