numpy 3d数组:规范最后一维中的列,同时过滤最后一维中的特定行

时间:2018-07-16 18:06:32

标签: python numpy

嗨,我已经尝试解决这个问题一段时间了,无法解决。

我需要逐列对(M,N,2)numpy数组中的值进行规范化(即:分别规范化[:,:,0]和[:,:,1])。

另一个挑战是,我必须忽略所有对值均为0的“行”。(即:[[m,n,:] == [0,0]))

以下是示例输入/输出:

输入:

np.array([[[1, 2],
           [2, 3],
           [5, 4]],

          [[0, 0],
           [1, 2],
           [3, 0]],

          [[0, 0],
           [0, 0],
           [0, 3]],

          [[1, 7],
           [-3, 3],
           [2, 4]]])

输出:

np.array([[[0.5, 0.2857..],
           [0.625, 0.4285..],
           [1, 0.5714..]],

          [[0, 0],
           [0.5, 0.2857],
           [0.75, 0]],

          [[0, 0],
           [0, 0],
           [0.375, 0.4285]],

          [[0.5, 1],
           [0, 0.4285],
           [0.625, 0.5714]]])

我必须在很多行上应用此功能〜100MB 预先感谢

PS:范数公式(x-min(x))/(max(x)-min(x))

1 个答案:

答案 0 :(得分:1)

100MB并不是很大,所以也许只需掩盖您需要忽略的“行”就足够了:

arr = arr.astype(np.float64)
zero = (arr == 0).all(axis=2)
keep = arr[~zero]
low, high = keep.min(axis=0), keep.max(axis=0)
arr[~zero] = (keep - low) / (high - low)

给我

In [55]: arr
Out[55]: 
array([[[0.5       , 0.28571429],
        [0.625     , 0.42857143],
        [1.        , 0.57142857]],

       [[0.        , 0.        ],
        [0.5       , 0.28571429],
        [0.75      , 0.        ]],

       [[0.        , 0.        ],
        [0.        , 0.        ],
        [0.375     , 0.42857143]],

       [[0.5       , 1.        ],
        [0.        , 0.42857143],
        [0.625     , 0.57142857]]])