【发布时间】:2025-11-30 10:40:01
【问题描述】:
我有一个代码可以将 bin 重新分配给一个大的 numpy 数组。基本上,大数组的元素已经以不同的频率进行采样,最终目标是在固定的 bin freq_bins 处重新组合整个数组。对于我拥有的数组,代码有点慢。有什么好的方法可以提高这段代码的运行时间吗?现在只有少数人会这样做。可能会有一些numba 魔法。
import numpy as np
import time
division = 90
freq_division = 50
cd = 3000
boost_factor = np.random.rand(division, division, cd)
freq_bins = np.linspace(1, 60, freq_division)
es = np.random.randint(1,10, size = (cd, freq_division))
final_emit = np.zeros((division, division, freq_division))
time1 = time.time()
for i in xrange(division):
fre_boost = np.einsum('ij, k->ijk', boost_factor[i], freq_bins)
sky_by_cap = np.einsum('ij, jk->ijk', boost_factor[i],es)
freq_index = np.digitize(fre_boost, freq_bins)
freq_index_reshaped = freq_index.reshape(division*cd, -1)
freq_index = None
sky_by_cap_reshaped = sky_by_cap.reshape(freq_index_reshaped.shape)
to_bin_emit = np.zeros(freq_index_reshaped.shape)
row_index = np.arange(freq_index_reshaped.shape[0]).reshape(-1, 1)
np.add.at(to_bin_emit, (row_index, freq_index_reshaped), sky_by_cap_reshaped)
to_bin_emit = to_bin_emit.reshape(fre_boost.shape)
to_bin_emit = np.multiply(to_bin_emit, freq_bins, out=to_bin_emit)
final_emit[i] = np.sum(to_bin_emit, axis=1)
print(time.time()-time1)
【问题讨论】:
-
也许解释一下这段代码在做什么会有所帮助......
-
@Julien 抱歉,我现在添加了更多解释。
-
在第 21 行你有: to_bin_emit = to_bin_emit.reshape(frequency_boost1.shape) frequency_boost1.shape 定义在哪里?
-
@TimothyLombard 抱歉,这个问题现在已经修复了。
-
关于第 22 行:NameError: name 'to_bin_emission' is not defined 您的示例似乎是独立的,也许您应该考虑在发布之前在笔记本中运行代码片段......我喜欢使用新的谷歌实用程序colab.research.google.com
标签: python arrays performance numpy numba