我正在 NumPy 中實作模擬,作為模擬更新步驟的一部分,我需要解決以下問題。有一些水將分布在一組不同深度的連接箱中。我需要找到要放入每個垃圾箱的水量,以使整體水位相同。
因此,例如,如果有 4 個深度為 1、2、3 和 5 的箱,并且我必須分配 5 個單位的水,那么我將分配 3 1/3 個單位到深度 5 的箱中,將 1 1/3 個單位分配到深度 3 bin 和深度 2 bin 的 1/3 個單位。

因此,給定一個箱深度陣列和要分配的水量,我需要計算一個陣列,該陣列描述要分配到每個箱中的水量。
我需要一個非常高性能的解決方案,因為這個特定的例程在模擬程序中被多次呼叫。計算這個函式可能是程式中最慢的部分。所以,我有點需要一個 NumPy 解決方案,如果可能的話,出于性能原因避免使用 Python。
編輯:在實際問題中,總是少于 9 個 bin,但確切的數字可能會有所不同。如果有幫助,我可以限制垃圾箱的深度。
有人有想法么?
uj5u.com熱心網友回復:
我讓 numpy 實作作業。不過,它可以使用 numba 進行優化。
對于其他人的回答:有一個不便 - 當某些 bin 具有相同的深度時,代碼需要解決這個問題。
import numpy as np
def find_levels_numpy(bins, n_units):
depth_diff = np.diff(bins)
bin_bottom_level = np.concatenate([[0], np.cumsum(-depth_diff)])
volume_for_bottom_bin = np.cumsum(np.concatenate([[0], -depth_diff]) * np.arange(len(bins)))
# NOTE: results of the code above could be cached for given bins and reused for different n_units!
idx_of_last_filled_bin = np.searchsorted(volume_for_bottom_bin, n_units) - 1
levels = bin_bottom_level[idx_of_last_filled_bin] - bin_bottom_level
remainder = n_units - volume_for_bottom_bin[idx_of_last_filled_bin]
levels = remainder / (idx_of_last_filled_bin 1)
levels[idx_of_last_filled_bin 1:] = 0
return levels
if __name__ == '__main__':
# sorting bins for convenience
bins = np.array([0.5, 5, 3, 2, 1, 1])
n_units = 11
sort_indices = np.argsort(bins)[::-1]
bins = bins[sort_indices]
level_by_bin = find_levels_numpy(bins, n_units)
# undoing sorting
level_by_bin[sort_indices] = level_by_bin[np.arange(len(sort_indices))]
print(level_by_bin)
print(np.sum(level_by_bin))
[0.25 4.75 2.75 1.75 0.75 0.75]
11.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/380992.html
下一篇:這些結構哪個更好?
