为了账号安全,请及时绑定邮箱和手机立即绑定

如何根据一行的平均值设置阈值?

如何根据一行的平均值设置阈值?

湖上湖 2021-08-05 10:36:21
我有一个二维数组。我想将每一行中大于该行平均值的所有值设置为 0。一些天真地执行此操作的代码是:new_arr = arr.copy()for i, row in enumerate(arr):    avg = np.mean(row)    for j, pixel in enumerate(row):        if pixel > avg:            new_arr[i,j] = 0        else:            new_arr[i,j] = 1这很慢,我想知道是否有某种方法可以使用 Numpy 索引来做到这一点?如果它是整个矩阵的平均值,我可以简单地做:mask = arr > np.mean(arr)arr[mask] = 0arr[np.logical_not(mask)] = 1是否有某种方法可以使用一维平均值数组或类似的东西对每行平均值执行此操作?编辑:建议的解决方案:avg = np.mean(arr, axis=0)mask = arr > avgnew_arr = np.zeros(arr.shape)arr[mask] = 1实际上使用的是列平均值,这对某些人也可能有用。它相当于:new_arr = arr.copy()for i, row in enumerate(arr.T):    avg = np.mean(row)    for j, pixel in enumerate(row):        if pixel > avg:            new_arr[j,i] = 0        else:            new_arr[j,i] = 1
查看完整描述

3 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

设置


a = np.arange(25).reshape((5,5))

你可以用keepdims与mean:


a[a > a.mean(1, keepdims=True)] = 0

array([[ 0,  1,  2,  0,  0],

       [ 5,  6,  7,  0,  0],

       [10, 11, 12,  0,  0],

       [15, 16, 17,  0,  0],

       [20, 21, 22,  0,  0]])

使用keepdims=True, 给出以下结果mean:


array([[ 2.],

       [ 7.],

       [12.],

       [17.],

       [22.]])

文档中说明了这样做的好处:


如果将其设置为 True,则减少的轴将作为尺寸为 1 的维度保留在结果中。使用此选项,结果将针对输入数组正确广播。


查看完整回答
反对 回复 2021-08-05
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

您可以使用np.mean(a, axis=1)来获取每行的平均值,将其广播到 的形状a,并将所有值设置a > broadcasted_mean_array为 0:


示例:


a = np.arange(25).reshape((5,5))

>>> a

array([[ 0,  1,  2,  3,  4],

       [ 5,  6,  7,  8,  9],

       [10, 11, 12, 13, 14],

       [15, 16, 17, 18, 19],

       [20, 21, 22, 23, 24]])


a[a > np.broadcast_to(np.mean(a,axis=1),a.shape).T] = 0 


>>> a

array([[ 0,  1,  2,  0,  0],

       [ 5,  6,  7,  0,  0],

       [10, 11, 12,  0,  0],

       [15, 16, 17,  0,  0],

       [20, 21, 22,  0,  0]])


查看完整回答
反对 回复 2021-08-05
?
忽然笑

TA贡献1806条经验 获得超5个赞

使用axis关键字表示您的意思:


avg = np.mean(arr, axis=0)

然后使用它来创建您的掩码并分配您想要的值:


mask = avg>=arr

new_arr = np.zeros(arr.shape)

arr[mask] = 1

当然,您可以直接从掩码创建一个新数组,而无需两步方法。


查看完整回答
反对 回复 2021-08-05
  • 3 回答
  • 0 关注
  • 218 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信