对于维度为n
的numpy数组,我想将np.nanmax()应用于n-1
维度,从而生成一维最大值的数组,而忽略所有设置为np.nan
的值。
q = np.arange(5*4*3.).reshape(3,4,5) % (42+1)
q[q%5==0] = np.nan
生产:
array([[[ nan, 1., 2., 3., 4.],
[ nan, 6., 7., 8., 9.],
[ nan, 11., 12., 13., 14.],
[ nan, 16., 17., 18., 19.]],
[[ nan, 21., 22., 23., 24.],
[ nan, 26., 27., 28., 29.],
[ nan, 31., 32., 33., 34.],
[ nan, 36., 37., 38., 39.]],
[[ nan, 41., 42., nan, 1.],
[ 2., 3., 4., nan, 6.],
[ 7., 8., 9., nan, 11.],
[ 12., 13., 14., nan, 16.]]])
如果我提前知道要使用最后一个轴作为剩余尺寸,则可以使用
-1
中的.reshape()
功能并执行以下操作:np.nanmax(q.reshape(-1, q.shape[-1]), axis=0)
产生我想要的结果:
array([ 12., 41., 42., 38., 39.])
但是,假设我不知道我不希望将最大值应用于哪个轴?假设我从
n=4
尺寸开始,并希望将其应用于除第m
个轴(可能为0、1、2或3)以外的所有轴?实际需要使用条件if-elif-else吗?是否有可能像假设的
exeptaxis=m
一样起作用? 最佳答案
axis
的nanmax
参数可以是计算最大值的轴的元组。对于您的情况,您希望该元组包含除m
之外的所有轴。这是您可以执行此操作的一种方法:
In [62]: x
Out[62]:
array([[[[ 4., 3., nan, nan],
[ 0., 2., 2., nan],
[ 4., 5., nan, 3.],
[ 2., 0., 3., 1.]],
[[ 2., 0., 0., 1.],
[ nan, 3., 0., nan],
[ 0., 1., nan, 2.],
[ 5., 4., 0., 1.]],
[[ 4., 0., 2., 0.],
[ 4., 0., 4., 5.],
[ 3., 4., 1., 0.],
[ 5., 3., 4., 3.]]],
[[[ 2., nan, 6., 4.],
[ 3., 1., 2., nan],
[ 5., 4., 1., 0.],
[ 2., 6., 0., nan]],
[[ 4., 1., 4., 2.],
[ nan, 1., 5., 5.],
[ 2., 0., 1., 1.],
[ 6., 3., 6., 5.]],
[[ 1., 0., 0., 1.],
[ 1., nan, 2., nan],
[ 3., 4., 0., 5.],
[ 1., 6., 2., 3.]]]])
In [63]: m = 0
In [64]: np.nanmax(x, axis=tuple(i for i in range(x.ndim) if i != m))
Out[64]: array([ 5., 6.])