如何用2D索引数组提取3D NumPy数组值?或获取对应最小值数组?
解决方案
1. 用2D索引数组提取3D数组对应值
你可以用广播索引或者np.take_along_axis实现,这两种方法没有np.choose的列数限制,且效率更高:
方法一:广播索引
先生成前两个维度的网格索引,再和indices组合完成索引:
import numpy as np # 假设vals和indices已定义 rows, cols = np.indices(indices.shape) extracted_vals = vals[rows, cols, indices]
rows和cols会自动广播为与indices同形状的数组,每个位置(i,j)都会精准提取vals[i,j,indices[i,j]]。
方法二:np.take_along_axis(更简洁)
给indices增加一个维度匹配vals的axis=2,提取后压缩多余维度:
extracted_vals = np.take_along_axis(vals, indices[..., np.newaxis], axis=2).squeeze(axis=2)
indices[..., np.newaxis]将形状从(65,65)转为(65,65,1),与vals前两个维度对齐,take_along_axis沿axis=2提取对应索引的值,最后squeeze去掉冗余维度得到(65,65)的结果。
2. 直接获取每个网格位置的最小值数组
直接对vals沿第三个维度(axis=2)取最小值即可:
min_vals = vals.min(axis=2)
该操作会遍历每个(i,j)位置的3500个值,返回对应最小值,结果形状为(65,65)。
补充:np.choose崩溃原因
np.choose对输入数组的维度有严格限制(旧版本中最多支持32个选择项),你将vals重塑为(3500,65,65)后,选择项数量远超限制,因此触发错误。上述两种索引方法无此限制,更适配大维度数组场景。
内容的提问来源于stack exchange,提问作者user243896
相关产品推荐
相关产品推荐

