Numpy:对数组施加依赖于行的最大值



假设我有以下数组:

a = [[1, 4, 2, 3]
     [3, 1, 5, 4]
     [4, 3, 1, 2]]

我想做的是在数组上施加一个最大值,但让该最大值因行而异。例如,如果我想将第一行和第三行限制为最大值 3,将第二行限制为值 4,我可以创建如下内容:

[[1, 3, 2, 3]
 [3, 1, 4, 4]
 [3, 3, 1, 2]

有没有比单独循环每一行并将其设置为"非零"更好的方法?

numpy.clip (使用此处的方法版本(:

a.clip(max=np.array([3, 4, 3])[:, None]) # np.clip(a, ...)
# array([[1, 3, 2, 3],
#        [3, 1, 4, 4],
#        [3, 3, 1, 2]])

广义:

def clip_2d_rows(a, maxs):
    maxs = np.asanyarray(maxs)
    if maxs.ndim == 1:
        maxs = maxs[:, np.newaxis]
    return np.clip(a, a_min=None, a_max=maxs)

使用模块级函数 ( np.clip ( 比使用类方法 ( np.ndarray.clip ( 更安全。 前者使用a_max作为参数,而后者使用内置max作为参数,这从来都不是一个好主意。

with masking -

In [50]: row_lims = np.array([3,4,3])
In [51]: np.where(a > row_lims[:,None], row_lims[:,None], a)
Out[51]: 
array([[1, 3, 2, 3],
       [3, 1, 4, 4],
       [3, 3, 1, 2]])

>>> a
array([[1, 4, 2, 3],
       [3, 1, 5, 4],
       [4, 3, 1, 2]])

假设你有

>>> maxs = np.array([[3],[4],[3]])
>>> maxs
array([[3],
       [4],
       [3]])

做呢

>>> a.clip(max=maxs)
array([[1, 3, 2, 3],
       [3, 1, 4, 4],
       [3, 3, 1, 2]])

最新更新