с учетом np.array формы (n_days, n_lat, n_lon)
, я бы хотел вычислить гистограмму с фиксированными ячейками для каждой ячейки lat-lon (т.е. распределение ежедневных значений).Гистограмма Numpy на многомерном массиве
Простое решение этой проблемы заключается в петле над клетками и вызывать 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
, а затем использовать фантазии индексации обновить 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
, но это не работает, потому что в месте добавить оператор (+ =), похоже, не поддерживает несколько обновлений одной и той же ячейки.
ТНХ, Питер
похоже, что https://github.com/numpy/numpy/pull/2821 обратился к причудливой индексации и проблеме на месте. Причина, по которой numpy не разрешает множественные обновления, состоит в том, что '' a [idx] + = 1'' не будет таким же, как '' a [idx] = a [idx] + 1''. –
Используйте ['np.histogram2d'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram2d.html) с аргументом ключевого слова' weightights'. – Jaime
@Jaime, как бы использовать «вес»? Я не хочу делать 2d гистограмму. –