Numpy:使用掩码为不同的行指定不同的值

2024-10-03 11:23:19 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个数组p在形状(m, n),一个阈值向量Ts在形状(m)。我想使用以下规则替换p中的值:

for i in range(m):
    for j in range(n):
        if p[i, j] > Ts[i]:
            p[i, j] = Ts[i]

我的实施是:

newP = np.zeros_like(p)
cond = p > Ts[:, None]
newP += cond * Ts[:, None]
newP += ~cond * p
p = newP

它看起来确实很难看。我想知道是否有类似p[cond]=Ts风格的方法。谢谢:)


例如:

# m = 2, n = 5
p = np.array([[1, 2, 3, 4, 5],
              [6, 7, 8, 9, 10]])
Ts = np.array([3, 8])
expected_new_p = \
    np.array([[1, 2, 3, 3, 3],
              [6, 7, 8, 8, 8]])

Tags: innoneforif规则nprange阈值
3条回答

您可以使用np.tile将阈值数组强制转换为输入数组。因此,您可以直接使用布尔索引。这可能对您有用:

    m, n = 3, 4
    x = np.random.random((m,n))
    t = np.random.random((m))
    
    mask = x > t[:,np.newaxis]
    
    x[mask] = np.tile(t[:,np.newaxis], (1,n))[mask] #assigning values of t for True values to corresponding elements

您可以简单地使用np.where。如果不满足条件,则从广播的Ts返回元素,否则返回相应的p

np.where(p < Ts[:, None], p, Ts[:, None])
array([[1, 2, 3, 3, 3],
       [6, 7, 8, 8, 8]])

您可以通过向Ts添加额外维度来比较pTs,提取p < Ts^{}之间的位置。然后,使用Ts中的值进行OVERWRITE:

i = np.where(p > Ts[:, None])
p[i] = Ts[i[0]]

上面,i是数组的元组,包含p的每个维度中的索引

相关问题 更多 >