【问题标题】:Change cell values in numpy 2D array to match a number更改 numpy 二维数组中的单元格值以匹配数字
【发布时间】:2015-11-28 05:53:51
【问题描述】:
import numpy as np
np.random.random((5,5))

array([[ 0.26045197,  0.66184973,  0.79957904,  0.82613958,  0.39644677],
       [ 0.09284838,  0.59098542,  0.13045167,  0.06170584,  0.01265676],
       [ 0.16456109,  0.87820099,  0.79891448,  0.02966868,  0.27810629],
       [ 0.03037986,  0.31481138,  0.06477025,  0.37205248,  0.59648463],
       [ 0.08084797,  0.10305354,  0.72488268,  0.30258304,  0.230913  ]])

我有一个 2D numpy 数组,每个单元格值代表一个分数(介于 0.0 和 1.0 之间)。我想修改二维数组,使数组平均值匹配一个特定的数字,比如 0.8。为此,我想使用 foll。算法:

  1. 计算二维数组的平均值。假设给定的二维数组是 0.6

  2. 对于网格中的每个单元格(例如值为 0.25),将其值增加/减少等于(0.8 - 0.6 即 0.2)的量。

  3. 如果在第 2 步中,更改使单元格值超出 0.0/1.0,则将值设置为 0.0/1.0 并修改其他单元格进行补偿。

我可以像这样执行第 1 步:

numpy.mean(arr)

我可以使用 for 循环执行第 2 步,但不知道如何执行第 3 步。另外,更喜欢 Python 的方式。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    Numpy 的索引魔法很有趣:

    import numpy as np
    aa = np.random.random((5, 5))
    
    m = np.mean(aa)
    d = 0.8 - m  # value to add
    bb = aa + d
    
    if d > 0:  # Modify values  != 1
        ii = aa + d > 1
        d2 = np.sum(bb[ii] - 1)
        bb[ii] = 1
        bb[~ii] = bb[~ii] + d2/np.sum(~ii)
    elif d < 0:  # Modify values  != 0
        ii = aa + d < 0
        d2 = np.sum(bb[ii])
        bb[ii] = 1
        bb[~ii] = bb[~ii] + d2/np.sum(~ii)
    
    print("The mean of bb is %f" % np.mean(bb))
    

    出于好奇:对于此类问题,缩放(即乘法)而不是减法不是更自然的方法吗?

    【讨论】:

    • 感谢@Dietrich,乘法也可以。您的解决方案很好,但它不能完全解决步骤 3,即它不会修改其他单元格以补偿特定单元格值是否必须绑定到 0.0 或 1.0
    • 希望我正确理解了您的问题。我更新了答案,以便平均值是正确的。我将第 3 步解释为下限或上限保持不变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多