Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更改numpy 2D数组中的单元格值以匹配数字_Python_Numpy - Fatal编程技术网

Python 更改numpy 2D数组中的单元格值以匹配数字

Python 更改numpy 2D数组中的单元格值以匹配数字,python,numpy,Python,Numpy,我有一个2D numpy数组,每个单元格值表示一个分数(介于0.0和1.0之间)。我想修改2D数组,使数组平均值与特定数字匹配,例如0.8。要做到这一点,我想使用foll。算法: 计算二维阵列的平均值。假设给定2D数组的值为0.6 对于网格中的每个单元格(假设值为0.25),将其值增加/减少等于(0.8-0.6,即0.2) 如果在步骤2中,更改使单元格值超出0.0/1.0,则将值设置为0.0/1.0,并修改其他单元格以进行补偿 我可以这样做步骤1: import numpy as np np.r

我有一个2D numpy数组,每个单元格值表示一个分数(介于0.0和1.0之间)。我想修改2D数组,使数组平均值与特定数字匹配,例如0.8。要做到这一点,我想使用foll。算法:

  • 计算二维阵列的平均值。假设给定2D数组的值为0.6

  • 对于网格中的每个单元格(假设值为0.25),将其值增加/减少等于(0.8-0.6,即0.2)

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

  • 我可以这样做步骤1:

    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  ]])
    

    我可以使用for循环执行步骤2,但不确定如何执行步骤3。此外,最好采用一种更具python风格的方式。

    Numpy的索引魔术非常有趣,可以使用:

    numpy.mean(arr)
    
    将numpy导入为np
    aa=np.random.random((5,5))
    m=np.平均值(aa)
    d=0.8-m#增加值
    bb=aa+d
    如果d>0:#修改值!=1.
    ii=aa+d>1
    d2=np.和(bb[ii]-1)
    bb[ii]=1
    bb[~ii]=bb[~ii]+d2/np.和(~ii)
    elif d<0:#修改值!=0
    ii=aa+d<0
    d2=np.和(bb[ii])
    bb[ii]=1
    bb[~ii]=bb[~ii]+d2/np.和(~ii)
    打印(“bb的平均值为%f”%np.平均值(bb))
    

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

    谢谢@Dietrich,乘法也可以。您的soln很好,但它不能完全解决步骤3,即,如果特定单元格值必须绑定到0.0或1.0,它不会修改其他单元格以进行补偿。我希望我正确理解了您的问题。我更新了答案,使平均数是正确的。我对步骤3的解释是,下限或上限保持不变。
    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))