我们说我有一个数组:
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(总计= 16.50)
Row2 2.20 3.30 4.40 5.50 6.60(总计= 22.00)
Row3 4.20 5.01 2.50 3.30 1.10(总计= 16.11)
到(最后总计)::
Row1 0.07 0.13 0.20 0.27 0.33(总计= 1.00)
Row2 0.10 0.15 0.20 0.25 0.30(总计= 1.00)
Row3 0.26 0.31 0.16 0.20 0.07(总计= 1.00)
我通过简单地添加一行来实现这一点,然后将每行中的每个单元格划分为该行的总和。我不知道如何在python中使用带有负值的数组来实现这一点。
答案 0 :(得分:1)
首先使用min-max规范化来转换原始数据,这可能是一种方法:
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)
答案 1 :(得分:1)
正如我所说的,我不认为你可以完全达到你所需要的(因为如果你有正面和负面的价值观,那么你总会在正面和负面价值中混合使用。值与行总和的比率)。 但我认为这很接近。
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]
答案 2 :(得分:0)
这是你要求的:
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]
答案 3 :(得分:0)
这是一个有效的例子:
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))]