所以我写了一个函数来标准化我的数据,但是我无法使其正常工作。我想遍历数据数组并将其标准化
这是我的职能
我已经尝试过移调我的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。
答案 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 (单击顶部的“运行”以在右侧输出)