【问题标题】:column-wise normalization (scaling) of arrays数组的按列归一化(缩放)
【发布时间】:2015-03-04 07:46:04
【问题描述】:

我想在 python 中规范化(放入范围 [0, 1])一个二维数组,但相对于特定列。

例如,给定:

a = array([[1 2 3],[4,5,6],[7,8,9]])

我需要类似“norm_column_wise(a,1)”的东西,它采用矩阵“a”,并且只对第二列 [2,5,8] 进行归一化,

结果应该是:

norm_column_wise(a,1) = array([[1,0,3],[4,0.5,6],[7,1.0,9]])

我写了一个简单的规范化代码:

def norm_column_wise(arr): 
    return (arr-arr.min(0))/(arr.max(0)-arr.min(0))

但它适用于数组的所有列。如何修改这个简单的代码以指定特定的列?

提前致谢!

【问题讨论】:

  • 这里的标准化是什么意思?我不明白为什么 [2,5,8] 会被标准化为 [0,0.5,1.0],如您的示例中所示。
  • @physicalattraction,感谢您的评论。这是从 [a,b] -> [0,1] 的简单缩放。它由 (Z-min(Z))/(max(Z)-min(Z)) 完成。
  • 在我的情况下 min = 2,max = 8,所以 ([2,5,8] - [2,2,2])/6 = [0,0.5,1.]跨度>

标签: python arrays numpy normalization


【解决方案1】:

我会为此使用 numpy。

import numpy as np

def normalize_column(A, col):
    A[:,col] = (A[:,col] - np.min(A[:,col])) / (np.max(A[:,col]) - np.min(A[:,col]))

if __name__ == '__main__':
    A = np.matrix([[1,2,3], [4,5,6], [7,8,9]], dtype=float)
    normalize_column(A, 1)
    print (A)

结果

[[ 1.   0.   3. ]
 [ 4.   0.5  6. ]
 [ 7.   1.   9. ]]

根据上面的注释,max-min 可以替换为:

np.ptp(A,0)[0,col]

【讨论】:

  • 谢谢大家!上一个答案在哪里?它消失了。另一件事是,如何保持原始数组(“A”)不受影响?如果我在同一个数组上多次应用“normalize_column(A, col)”,它每次都会改变它。
  • 代替A[:,col] = ...,将B复制为A,在点上写上完全相同的代码B = ...,然后返回B
  • 对不起,我的错。我的意思是,复制并写B[:,col] = ...,而不仅仅是B = ...
猜你喜欢
  • 2015-01-13
  • 1970-01-01
  • 2019-12-09
  • 2020-11-10
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
相关资源
最近更新 更多