遍历数组的各列以标准化数据

时间:2019-01-29 14:11:30

标签: python arrays numpy for-loop

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

这是我的职能

我已经尝试过移调我的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。

1 个答案:

答案 0 :(得分: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 (单击顶部的“运行”以在右侧输出)