Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python numpy掩码平均性能_Python_Arrays_Performance_Numpy_Masking - Fatal编程技术网

python numpy掩码平均性能

python numpy掩码平均性能,python,arrays,performance,numpy,masking,Python,Arrays,Performance,Numpy,Masking,好吧,经过一番搜索,我似乎找不到一个能直接解决这个问题的问题。我研究过蒙面阵列,虽然它们看起来很酷,但我不确定它们是否是我所需要的 考虑2个numpy阵列: zone_data是一个二维numpy数组,包含具有相同值的元素束。这是我的“区域” value\u data是一个具有任意值的二维numpy数组(分区数据的精确形状) 我寻找一个与zone_data/value_data形状相同的numpy数组,该数组具有每个分区的平均值,而不是分区编号 示例…ascii艺术形式 区域\u数据(4个不同区

好吧,经过一番搜索,我似乎找不到一个能直接解决这个问题的问题。我研究过蒙面阵列,虽然它们看起来很酷,但我不确定它们是否是我所需要的

考虑2个numpy阵列:

zone_data
是一个二维numpy数组,包含具有相同值的元素束。这是我的“区域”

value\u data
是一个具有任意值的二维numpy数组(分区数据的精确形状)

我寻找一个与zone_data/value_data形状相同的numpy数组,该数组具有每个分区的平均值,而不是分区编号

示例…ascii艺术形式

区域\u数据
(4个不同区域):

值\u数据

1, 2, 3, 6
3, 0, 2, 5
1, 1, 1, 0
2, 4, 2, 1
1.5, 1.5, 4.0, 4.0
1.5, 1.5, 4.0, 4.0
2.0, 2.0, 1.0, 1.0
2.0, 2.0, 1.0, 1.0
我的结果,称之为
result\u data

1, 2, 3, 6
3, 0, 2, 5
1, 1, 1, 0
2, 4, 2, 1
1.5, 1.5, 4.0, 4.0
1.5, 1.5, 4.0, 4.0
2.0, 2.0, 1.0, 1.0
2.0, 2.0, 1.0, 1.0
这是我的密码。就给我一个完美的结果而言,它工作得很好

result_data = np.zeros(zone_data.shape)
for i in np.unique(zone_data):
    result_data[zone_data == i] = np.mean(value_data[zone_data == i])
我的数组很大,我的代码片段需要几秒钟。我想我有一个知识缺口,没有发现任何有用的东西。循环方面需要委托给一个库或其他东西…aarg

我寻求帮助,使这更快!巨蟒之神,我寻求你的智慧

编辑--添加基准脚本

import numpy as np
import time

zones = np.random.randint(1000, size=(2000,1000))
values = np.random.rand(2000,1000)

print 'start method 1:'
start_time = time.time()

result_data = np.zeros(zones.shape)
for i in np.unique(zones):
    result_data[zones == i] = np.mean(values[zones == i])

print 'done method 1 in %.2f seconds' % (time.time() - start_time)

print
print 'start method 2:'
start_time = time.time()

#your method here!

print 'done method 2 in %.2f seconds' % (time.time() - start_time)
我的输出:

start method 1:
done method 1 in 4.34 seconds

start method 2:
done method 2 in 0.00 seconds

我以为我在scipy的某个地方见过这个,但我再也找不到了。你看过那里吗

无论如何,通过更改循环,您可以获得第一个改进:

result_data = np.empty(zones.shape)  # minor speed gain
for label in np.unique(zones):
    mask = zones==label
    result_data[mask] = np.mean(values[mask])
这样,就不必进行两次布尔比较。这将减少一点执行时间。

您可以使用:

这让我

start method 1:
done method 1 in 3.13 seconds

start method 2:
done method 2 in 0.01 seconds
>>> 
>>> np.allclose(result_data, result_data2)
True

出色地使用了
bincount
+1DSM,太棒了!我之所以如此爱你,主要是因为像你这样的人能够分享一些我花了很长时间才发现自己的知识。非常感谢你!这不仅仅是一个琐碎的练习……这将打开我在应用程序中遇到的瓶颈之一。我也很喜欢“np.allclose”…真是一颗宝石。这是一个很好的观察。在我的情况下,它将节省约40%…这是伟大的,我应该知道更好的…我已经在许多其他地方这样做了。不过,我会接受DSM的答案,因为它比DSM快100多倍!