python – 基于2d掩码数组的numpy 3d到2d变换

python – 基于2d掩码数组的numpy 3d到2d变换,第1张

概述如果我有这样的ndarray: >>> a = np.arange(27).reshape(3,3,3)>>> aarray([[[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8]], [[ 9, 10, 11], [12, 13, 14], [15, 16, 17]], 如果我有这样的ndarray:

>>> a = np.arange(27).reshape(3,3,3)>>> aarray([[[ 0,1,2],[ 3,4,5],[ 6,7,8]],[[ 9,10,11],[12,13,14],[15,16,17]],[[18,19,20],[21,22,23],[24,25,26]]])

我知道我可以使用np.max(axis = …)沿某个轴获得最大值:

>>> a.max(axis=2)array([[ 2,5,8],[11,14,17],[20,23,26]])

或者,我可以获得沿该轴的索引,这些索引对应于以下的最大值:

>>> indices = a.argmax(axis=2)>>> indicesarray([[2,2,[2,2]])

我的问题 – 给定数组索引和数组a,是否有一种优雅的方法来重现a.max(axis = 2)返回的数组?

这可能会奏效:

import itertools as itimport numpy as npdef apply_mask(fIEld,indices):    data = np.empty(indices.shape)    #It seems highly likely that there is a more numpy-approved way to do this.    IDx = [range(i) for i in indices.shape]    for IDx_tup,zIDx in zip(it.product(*IDx),indices.flat):        data[IDx_tup] = fIEld[IDx_tup+(zIDx,)]    return data

但是,它似乎非常Hacky /低效.它也不允许我使用除“最后”轴以外的任何轴.是否有一个numpy函数(或一些使用神奇的numpy索引)来使这项工作?天真的a [:,:,a.argmax(axis = 2)]不起作用.

更新:

似乎以下也有效(并且更好一些):

import numpy as npdef apply_mask(fIEld,indices):    data = np.empty(indices.shape)    for IDx_tup,zIDx in np.ndenumerate(indices):        data[IDx_tup] = fIEld[IDx_tup+(zIDx,)]    return data

我想这样做是因为我想基于1个数组中的数据提取索引(通常使用argmax(axis = …))并使用这些索引从一堆其他数据中提取数据(等效形状)阵列.我愿意采用其他方法来实现这一目标(例如使用布尔掩码数组).但是,我喜欢使用这些“索引”数组的“安全性”.有了这个,我保证有适当数量的元素来创建一个新的数组,看起来像是通过3d字段的2d“切片”.

解决方法 这里有一些神奇的numpy索引可以做你想要的,但不幸的是它很难读.

def apply_mask(a,indices,axis):    magic_index = [np.arange(i) for i in indices.shape]    magic_index = np.ix_(*magic_index)    magic_index = magic_index[:axis] + (indices,) + magic_index[axis:]    return a[magic_index]

或同样不可读:

def apply_mask(a,axis):    magic_index = np.ogrID[tuple(slice(i) for i in indices.shape)]    magic_index.insert(axis,indices)    return a[magic_index]
总结

以上是内存溢出为你收集整理的python – 基于2d掩码数组的numpy 3d到2d变换全部内容,希望文章能够帮你解决python – 基于2d掩码数组的numpy 3d到2d变换所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1196821.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存