对于维度为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一样起作用?

最佳答案

axisnanmax参数可以是计算最大值的轴的元组。对于您的情况,您希望该元组包含除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.])

10-08 03:51