Python:将2d数组的每一行缩放为总和为1的值。每行包含一些负值

Python:将2d数组的每一行缩放为总和为1的值。每行包含一些负值,python,multidimensional-array,probability,Python,Multidimensional Array,Probability,假设我有一个数组: 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]] 我希

假设我有一个数组:

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。对不起

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


第1行1.10 2.20 3.30 4.40 5.50(总计=16.50)
第2行2.20 3.30 4.40 5.50 6.60(总计=22.00)
第3行4.20 5.01 2.50 3.30 1.10(总计=16.11)

至(最后再次合计)::


第1行0.07 0.13 0.20 0.27 0.33(总计=1.00)
第2行0.10 0.15 0.20 0.25 0.30(总计=1.00)
第3行0.26 0.31 0.16 0.20 0.07(总计=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]] 


print [sum(_list) for _list in myArray]
?


这是你想要的吗:

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


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

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)

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

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]

正如我所说的,我认为你不能完全实现你所需要的(因为如果你有一个正负值的混合,你总是会有一个正负值的混合,在值与行的总和的比率中)。 但我想这很接近

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]

下面是一个工作示例:

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

下面是一个工作示例:

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


我很难理解您到底想要什么,您能提供一个示例输出和一些您尝试过的代码吗?@python第1行输入和第1行输出之间有什么关系吗??或者它们只是随机数…?我想我知道你现在的意思了,你想把所有的值加在一行,然后把这些值改成它们在总和中所代表的百分比。与第1行一样,1.10是该行总数的0.7(四舍五入为0.6666)。问题是我无法从头脑中想出一种方法来将消极因素整合成积极因素@这是我想做的一个很好的总结!“我意识到我不清楚。我希望得到的值是正的,和为零。对不起。”-我想这里的“和为一”是指“和为一”吗?我很难完全理解你想要什么,你能提供一个示例输出和一些你尝试过的代码吗?@python第1行输入和第1行输出之间有什么关系吗??或者它们只是随机数…?我想我知道你现在的意思了,你想把所有的值加在一行,然后把这些值改成它们在总和中所代表的百分比。与第1行一样,1.10是该行总数的0.7(四舍五入为0.6666)。问题是我无法从头脑中想出一种方法来将消极因素整合成积极因素@这是我想做的一个很好的总结!“我意识到我不清楚。我希望得到的值是正的,和为零。对不起。”-我想你是说这里的“和为一”?你也可以将原始数组转换为
numpy
数组,然后调用
.sum(axis=1)
来给出一个平均值数组,但我同意,我认为不可能做OP想要做的事。如果一行同时包含正值和负值,则必须先确定绝对值,然后执行此操作。这肯定很接近,但结果中仍然存在负值:newArray[0:1][[0.41469816272965887, 0.2860892388451444, 0.10761154855643044, -0.05774278215223098, 0.24934383202099739]]考虑一下基于统一的标准化:Hi @ LukPult是否有一种转换方法:将Python转换为一个数组?谢谢!非常感谢@ LukeBowl!你也可以将原来的数组转换成<代码> NoMPy < /Cord>数组,并调用<代码>。在它上面给出一个平均值数组,但我同意,我认为不可能按照OP的要求来做。如果一行包含正值和负值,您必须先确定绝对值,然后执行此操作。这当然是接近了,但结果中我仍然得到负值:ne战雷[0:1][[0.41469816272965887,0.2860892388451444,0.10761154855643044,-0.0577427821523098,0.24934383202099739]]考虑一下基于统一的标准化:Hi @ LukPult有一种转换方法:将Python应用到数组中?谢谢!非常感谢@ LukeBowl!这非常接近。但是,你能不能计算每行的最小数量(在行1的情况下,它是-1.58)。然后将其添加到第1行的每个元素中?这将确保第1行中的每个值现在都是正值。现在计算“它们在总和中所代表的百分比”我想这对我来说会是一个更好的结果,因为我想在第一行中强调,0.22是最大/最佳分数。我建议您使用可用的函数(如min),您应该能够从中找到所需的解决方案