假设我有以下数组:
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]
是否有更好的方法,而不是单独循环每一行并使用'非零'
进行设置?答案 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]])