Значения и операции с индексами между многомерными массивами NumPy - PullRequest
0 голосов
/ 11 сентября 2018

(я не знаю, как назвать этот вопрос. Поэтому не стесняйтесь редактировать)

У меня есть следующие массивы:

  • 3D-массив, содержащий значение для [z, y, x]

  • 3D-массив, содержащий высоту для [z, y, x]

  • 2D-массив, содержащий Maximum_altitude для [y,x]

z, y, x имеют одинаковую длину для 3-х массивов.

Я хотел бы новый 2D-вывод, содержащий value_at_max_altitude для [y, x]

Алгоритм должен быть примерно таким:

find z where altitude[z, y, x] > max_altitude[y, x]
value_at_max_altitude[y, x] = value[z, y, x]

Как бы вы это сделали с numpy?

edit: Вот решение, которое у меня есть на самом деле.Но мне было интересно, можно ли использовать пустые внутренние функции, чтобы избежать цикла:

# get index of Z for first value != False
z = np.argmax(altitude >= max_altitude, axis=0)

# z shape is [x, y]
ny, nx = z.shape

# initialize empty array
value_at_max_altitude = np.empty([ny, nx])

# fill value_at_max_altitude
for y in range(ny):
   for x in range(nx):
     value_at_max_altitude[y, x] = value[z[y, x], y, x]

1 Ответ

0 голосов
/ 15 сентября 2018

Если я понимаю ваш вопрос, вы пытаетесь сделать что-то вроде следующего.Поскольку вы не предоставили пример данных, я не уверен, но я думаю, что это соответствует решению с использованием циклов, которые у вас уже есть.

import numpy as np

# Generate example data
nz, ny, nx = 7, 5, 3
value = np.random.uniform(size=(nz, ny, nx))
altitude = np.random.uniform(size=(nz, ny, nx))
max_altitude = np.random.uniform(size=(ny, nx))

# Do the indexing
z = np.argmax(altitude >= max_altitude, axis=0)
value_at_max_altitude = value[(z, *np.ogrid[:ny, :nx])]

Похоже, вы просто пытаетесь проиндексировать свой value массив с массивом z индексов.В этом случае вам просто нужно сгенерировать массивы с соответствующими индексами x и y, что я и сделал с np.ogrid.Очевидным способом было бы использовать mgrid, но это генерировало бы два массива формы (ny, nx).Использование ogrid в этом случае дает массивы формы (ny, 1) и (1, nx) соответственно.Они по-прежнему могут индексироваться в массив, потому что Numpy транслирует во время индексации массивов массивами.Это, вероятно, важно, только если у вас nx и ny очень большие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...