【问题标题】:Iterate through columns of an array to standardize data遍历数组的列以标准化数据
【发布时间】:2019-01-29 14:11:30
【问题描述】:

所以我编写了一个函数来标准化我的数据,但我无法让它工作。我想遍历我的数据数组并将其标准化

这是我的功能

我已经尝试过转置我的 arr 但它仍然不起作用?

def Scaling(arr,data):    
    scaled=[[]]   
    for a in arr.T:
        scaled = ((a-data.mean())/(data.std()))
        scaled = np.asarray(scaled)
    return scaled

当我运行我的代码时,我只得到一个 1D 数组而不是 10D 作为输出。

【问题讨论】:

标签: python arrays numpy for-loop


【解决方案1】:

因为data.mean()data.std() 是聚合常量或标量,请考虑在不使用任何for 循环的情况下直接 对整个数组运行所需的算术运算。每个常量将在向量化操作中对数组的每一列进行操作:

def Scaling(arr,data):    
    return (arr.T-data.mean())/(data.std())

您当前的for 循环仅输出循环的最后一个数组分配。您初始化一个空的嵌套列表,但永远不要附加到它。事实上,您在每次迭代时重新分配和重新定义 scaled 到一个数组。理想情况下,您将数组附加到集合以在循环外连接在一起。尽管如此,简单的矩阵代数不需要这种类型的运算。


为了演示随机的种子数据(可以使用 OP 的实际数据进行修改),请参见下面的夸张的顺序输入数组以显示最终计算:

import numpy as np

np.random.seed(12919)
data = np.arange(10)
arr = np.concatenate([np.ones((5, 1)),
                      np.ones((5, 1))+1,
                      np.ones((5, 1))+2,
                      np.ones((5, 1))+3,
                      np.ones((5, 1))+4], axis=1)

def Scaling(arr,data):    
    return (arr.T-data.mean())/(data.std())

new_arr = Scaling(arr, data)

print(arr)
# [[1. 2. 3. 4. 5.]
#  [1. 2. 3. 4. 5.]
#  [1. 2. 3. 4. 5.]
#  [1. 2. 3. 4. 5.]
#  [1. 2. 3. 4. 5.]]

print(new_arr)
# [[-1.21854359 -1.21854359 -1.21854359 -1.21854359 -1.21854359]
#  [-0.87038828 -0.87038828 -0.87038828 -0.87038828 -0.87038828]
#  [-0.52223297 -0.52223297 -0.52223297 -0.52223297 -0.52223297]
#  [-0.17407766 -0.17407766 -0.17407766 -0.17407766 -0.17407766]
#  [ 0.17407766  0.17407766  0.17407766  0.17407766  0.17407766]]

Pyfiddle demo(点击顶部的运行以在右侧输出)

【讨论】:

  • 谢谢它的工作我现在得到了正确的尺寸,但是,当我尝试使用训练集中的均值和标准来扩展我的测试集时,我的结果没有意义
猜你喜欢
  • 2020-05-26
  • 2012-12-14
  • 2013-03-26
  • 2012-11-16
  • 1970-01-01
  • 2018-12-14
  • 2012-07-04
  • 2015-07-29
  • 1970-01-01
相关资源
最近更新 更多