Numpy:在数组

时间:2017-11-18 21:51:48

标签: python arrays numpy

假设我有以下数组:

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

我想要做的是在数组上施加最大值,但最大值因行而异。例如,如果我想将第1行和第3行限制为最大值3,将第2行限制为值4,我可以创建类似的内容:

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

是否有更好的方法,而不是单独循环每一行并使用'非零'

进行设置?

3 个答案:

答案 0 :(得分:3)

使用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作为参数,这绝不是一个好主意。

答案 1 :(得分:3)

使用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]])

答案 2 :(得分:1)

使用

>>> 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]])