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

时间:2015-11-27 21:10:48

标签: python numpy

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之间)。我想修改2D数组,以便数组平均值匹配特定数字,即0.8。为此,我想使用foll。 ALGO:

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

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

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

  5. 我可以这样做第1步:

    numpy.mean(arr)
    

    我可以使用for循环执行第2步,但不确定如何执行第3步。此外,更喜欢使用pythonic方式。

1 个答案:

答案 0 :(得分:2)

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

出于好奇:是不是缩放,即增加,而不是减去更自然的方法来解决这些问题?