将2d数组的每一行缩放为和为1的值.每行包含一些负值



假设我有一个数组:

myArray = [[-1.58, -1.09, -0.41,  0.22, -0.95],
          [-1.16, -1.27, -1.89, -1.01,  1.11],
          [-0.73, -0.81, -0.47, -0.46, -0.04],
          [-1.46, -0.82,  0.40, -0.22, -1.82],
          [-1.12 , -0.97, -0.89, -0.18,  0.06]]

我希望将这个数组的每行转换为每行之和为1的值。

这容易吗?

我的实际数组有几千行长,所以我想要一个尽可能优化的解决方案。非常感谢!

我意识到我没有说清楚。我希望结果值为正,并且和为1。对不起。

我可以给你一个使用正值的样本(即最后的总数):


Row1 1.10 2.20 3.30 4.40 5.50 (Total = 16.50)
Row2 2.20 3.30 4.40 5.50 6.60 (Total = 22.00)
Row3 4.20 5.01 2.50 3.30 1.10 (Total = 16.11)

to(再次加到末尾)::


Row1 0.07 0.13 0.20 0.27 0.33 (Total = 1.00)
Row2 0.10 0.15 0.20 0.25 0.30 (Total = 1.00)
Row3 0.26 0.31 0.16 0.20 0.07 (Total = 1.00)

我通过简单地添加一行,然后将每行中的每个单元格插入该行的总和来实现这一点。我不知道如何在python中实现这一点与一个数组,与负值。

首先使用最小-最大归一化来转换原始数据,这可能是一种方法:

myArray = [[-1.58, -1.09, -0.41, 0.22, -0.95], 
[-1.16, -1.27, -1.89, -1.01, 1.11], 
[-0.73, -0.81, -0.47, -0.46, -0.04], 
[-1.46, -0.82, 0.40, -0.22, -1.82], 
[-1.12 , -0.97, -0.89, -0.18, 0.06]]
#Transform data
normalizedArray = []
for row in range(0, len(myArray)):
    list = []
    Min =  min(myArray[row])
    Max = max(myArray[row])
    for element in myArray[row]:
        list.append(  float(element-Min)/float(Max- Min) )
    normalizedArray.append(list)
#Normalize to 1
newArray = []
for row in range(0, len(normalizedArray)):
    list = [x / sum(normalizedArray[row]) for x in normalizedArray[row]]
    newArray.append(list)

就像我说的,我不认为你可以实现你所需要的(因为如果你有一个正负值的组合,你总是有一个正负值的组合的值与行之和的比例)。但我觉得这已经很接近了。

import numpy as np
myArray = [[-1.58, -1.09, -0.41, 0.22, -0.95], 
[-1.16, -1.27, -1.89, -1.01, 1.11], 
[-0.73, -0.81, -0.47, -0.46, -0.04], 
[-1.46, -0.82, 0.40, -0.22, -1.82], 
[-1.12 , -0.97, -0.89, -0.18, 0.06]]
new_array = abs(np.asarray(new_array))
ratio_array = np.divide(new_array, new_array.sum(axis=1))

编辑:我使用了%timeit, numpy方法比上面的循环方法快10倍。

new_array = np.asarray(myArray)
transformed_array = new_array + (np.min(new_array, axis=1) * -1)[:, None]
ratio_matrix = transformed_array / np.sum(transformed_array, axis=1)[:, None]

这是你想要的吗?

myArray = [[-1.58, -1.09, -0.41, 0.22, -0.95], 
[-1.16, -1.27, -1.89, -1.01, 1.11], 
[-0.73, -0.81, -0.47, -0.46, -0.04], 
[-1.46, -0.82, 0.40, -0.22, -1.82], 
[-1.12 , -0.97, -0.89, -0.18, 0.06]] 

print [sum(_list) for _list in myArray]

?

[-3.8099999999999996, -4.219999999999999, -2.51, -3.92, -3.1]

下面是一个工作示例:

data = [[-1.58, -1.09, -0.41, 0.22, -0.95],
        [-1.16, -1.27, -1.89, -1.01, 1.11],
        [-0.73, -0.81, -0.47, -0.46, -0.04],
        [-1.46, -0.82, 0.40, -0.22, -1.82],
        [-1.12, -0.97, -0.89, -0.18, 0.06]]

print[[x / sum(data[r]) for x in data[r]] for r in range(0, len(data))]

相关内容

  • 没有找到相关文章