gpt4 book ai didi

python - 在大型 numpy 数组上运行 ndnumerate 的更快方法

转载 作者:行者123 更新时间:2023-11-30 23:23:36 24 4
gpt4 key购买 nike

嗨,我想加快我的计算速度,使用这个 ndnumerate 循环非常慢:

下面的循环遍历一个 numpy 数组并对每个单元格执行一些数学计算,但忽略 -9999 值,保持它们相同。

my_array = np.array([[-9999, 1, 1],
[2, 2, -9999],
[3, 3, 3]])

# Intialise two empty arrays
1_d = np.empty_like(my_array, dtype = float)
3_d = np.empty_like(my_array, dtype = float)

start = time.time()

for [x, y], value in np.ndenumerate(my_array):
if value >= 0:
1_d[x, y] = value - (20 * (100 - value)) / ((100 - value) + math.exp(2.533 - 0.0636 * (100 - value)))

3_d[x, y] = value * math.exp(0.00673 * (100 - value))
else:
1_d[x, y] = -9999
3_d[x, y] = -9999

print "Calculating numbers took " + str(round(time.time() - start,2)) + "s.")

最佳答案

您不应该使用循环来执行此操作,而只需使用 numpy 数组的矢量化性质,因为在这种情况下这是完全可能的:

a1_d = my_array - (20 * (100 - my_array)) / ((100 - my_array) + np.exp(2.533 - 0.0636 * (100 - my_array)))
a3_d = my_array * np.exp(0.00673 * (100 - my_array))

要恢复 -9999 值,您可以执行以下操作:

a1_d[my_array == -9999] = -9999
a3_d[my_array == -9999] = -9999

或者另一种选择是使用np.nan而不是-9999,它只会传播:

my_array = my_array.astype(float)
my_array[my_array == -9999] = np.nan

或者另一种选择是在计算过程中进行 bool 索引:

valid = (my_array != -9999)
a1_d[valid] = my_array[valid] * ...
a3_d[~valid] = -9999

对于这个小型示例数组,使用 for 循环大约需要 70 µs,而不是 260 µs(使用 %%timeit)

关于python - 在大型 numpy 数组上运行 ndnumerate 的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23870113/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com