在 numpy 数组中找到无穷大值并替换为每个向量的最大值

时间:2021-06-22 16:31:28

标签: python numpy

假设我有以下形状为 (3, 5) 的数组:

array = np.array([[1, 2, 3, inf, 5],
                    [10, 9, 8, 7, 6],
                    [4, inf, 2, 6, inf]])

现在我想找到每个向量的无穷大值并将它们替换为该向量的最大值,下限为 1。

所以这个例子的输出应该是:

array_solved = np.array([[1, 2, 3, 5, 5],
                    [10, 9, 8, 7, 6],
                    [4, 6, 2, 6, 6]])

我可以通过遍历数组的每个向量并应用来做到这一点:

idx_inf = np.isinf(array_vector)
max_value = np.max(np.append(array_vector[~idx_inf], 1.0))
array_vector[idx_inf] = max_value

但我想有一个更快的方法。

有人有想法吗?

2 个答案:

答案 0 :(得分:4)

import numpy as np

array = np.array([[1, 2, 3, np.inf, 5],
                    [10, 9, 8, 7, 6],
                    [4, np.inf, 2, 6, np.inf]])

n, m = array.shape
array[np.isinf(array)] = -np.inf
mx_array = np.repeat(np.max(array, axis=1), m).reshape(n, m)
ind = np.where(np.isinf(array))
array[ind] = mx_array[ind]

输出array

array([[ 1.,  2.,  3.,  5.,  5.],
       [10.,  9.,  8.,  7.,  6.],
       [ 4.,  6.,  2.,  6.,  6.]])

答案 1 :(得分:4)

一种方法是首先使用 np.isinf 掩码将 infs 转换为 NaNs,然后使用 np.nanmaxNaNs 转换为行的最大值:< /p>

array[np.isinf(array)] = np.nan
array[np.isnan(array)] = np.nanmax(array, axis=1)

得到

>>> array

array([[ 1.,  2.,  3.,  5.,  5.],
       [10.,  9.,  8.,  7.,  6.],
       [ 4., 10.,  2.,  6.,  6.]])