【发布时间】:2013-09-21 23:41:50
【问题描述】:
给定一个形状为(n_days, n_lat, n_lon) 的np.array,我想为每个经纬度单元计算一个带有固定箱的直方图(即每日值的分布)。
该问题的一个简单解决方案是遍历单元格并为每个单元格调用np.histogram::
bins = np.linspace(0, 1.0, 10)
B = np.rand(n_days, n_lat, n_lon)
H = np.zeros((n_bins, n_lat, n_lon), dtype=np.int32)
for lat in range(n_lat):
for lon in range(n_lon):
H[:, lat, lon] = np.histogram(A[:, lat, lon], bins=bins)[0]
# note: code not tested
但这很慢。有没有更高效的不涉及循环的解决方案?
我查看了 np.searchsorted 以获取 B 中每个值的 bin 索引,然后使用精美的索引更新 H::
bin_indices = bins.searchsorted(B)
H[bin_indices.ravel(), idx[0], idx[1]] += 1 # where idx is a index grid given by np.indices
# note: code not tested
但这不起作用,因为就地添加运算符 (+=) 似乎不支持同一单元格的多次更新。
谢谢, 彼得
【问题讨论】:
-
似乎github.com/numpy/numpy/pull/2821 解决了花哨的索引和就地问题。 numpy 不允许多次更新的原因是
a[idx] += 1与a[idx] = a[idx] + 1不同。 -
使用
np.histogram2d和weights关键字参数。 -
@Jaime 我将如何使用
weights?我不想做二维直方图。 -
还有一个
np.histogramdd函数。
标签: python arrays numpy histogram