多维numpy数组之间的值和索引操作

时间:2018-09-11 15:20:59

标签: python arrays numpy

(我不知道如何命名该问题。请随时进行编辑)

我有以下数组:

  • 包含[z,y,x]值的3D数组

  • 包含[z,y,x]高度的3D数组

  • 包含[y,x]的maximum_altitude的二维数组

z,y,x的3个数组的长度相同。

我想要一个新的2D输出,其中包含[y,x]的value_at_max_altitude

算法应该类似于

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

您如何用numpy做到这一点?

编辑: 这是我实际的解决方案。但是我想知道是否可以使用numpy内部函数来避免循环:

# 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 :(得分:0)

如果我理解您的问题,则您正在尝试执行以下操作。因为您没有提供示例数据,所以我不确定,但是我认为这与使用已有循环的解决方案相匹配。

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数组中。在那种情况下,您只需要生成具有相应的xy索引的数组,这就是我对np.ogrid所做的工作。显而易见的方法是使用mgrid,但这将生成两个形状为(ny, nx)的数组。在这种情况下,使用ogrid分别产生形状为(ny, 1)(1, nx)的数组。它们仍然能够索引到数组中,因为在使用数组对数组进行索引的过程中,Numpy broadcasts。仅当nxny很大时,这才可能很重要。