(我不知道如何命名该问题。请随时进行编辑)
我有以下数组:
包含[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]
答案 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
数组中。在那种情况下,您只需要生成具有相应的x
和y
索引的数组,这就是我对np.ogrid
所做的工作。显而易见的方法是使用mgrid
,但这将生成两个形状为(ny, nx)
的数组。在这种情况下,使用ogrid
分别产生形状为(ny, 1)
和(1, nx)
的数组。它们仍然能够索引到数组中,因为在使用数组对数组进行索引的过程中,Numpy broadcasts。仅当nx
和ny
很大时,这才可能很重要。