假设我有以下数组:
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]])