我在python中处理数组,这引起了很多疑惑......
1)我生成一个列表,列表从N个文件中读取4列,并在列表中存储4个元素N次。然后我将这个列表转换为numpy数组:
s = np.array(s)
我要求这个数组的形状。答案是正确的:
print s.shape
#(N,4)
然后我生成这个Nx4数组的平均值:
s_m = sum(s)/len(s)
print s_m.shape
#(4,)
我想这意味着这个数组是一维数组。这是对的吗?
2)如果我从数组的行中减去平均向量s_m,我可以用两种方式进行:
residuals_s = s - s_m
或:
residuals_s = []
for i in range(len(s)):
residuals_s.append([])
tmp = s[i] - s_m
residuals_s.append(tmp)
如果我现在要求在两种情况下残差的形状我得到两个不同的答案。在第一种情况下,我获得:
(N,4)
在第二个:
(N,1,4)
有人可以解释为什么还有其他维度吗?
答案 0 :(得分:1)
你可以使用numpy方法得到均值(产生相同的(4,)形状):
s_m = s.mean(axis=0)
s - s_m
有效,因为s_m
被“广播”到s
的维度。
如果我运行你的第二个residuals_s
,我会得到一个包含空列表和数组的列表:
[[],
array([ 1.02649662, 0.43613824, 0.66276758, 2.0082684 ]),
[],
array([ 1.13000227, -0.94129685, 0.63411801, -0.383982 ]),
...
]
它不会转换为(N,1,4)数组,而是转换为具有dtype = object的(M,)数组。你有没有正确复制和粘贴?
更正的迭代是:
for i in range(len(s)):
residuals_s.append(s[i]-s_m)
生成一个更简单的数组列表:
[array([ 1.02649662, 0.43613824, 0.66276758, 2.0082684 ]),
array([ 1.13000227, -0.94129685, 0.63411801, -0.383982 ]),
...]
转换为(N,4)数组。
通常不需要像这样的迭代。但如果是这样,追加到这样的列表是一种方法。另一种方法是预先分配一个数组,并分配行
residuals_s = np.zeros_like(s)
for i in range(s.shape[0]):
residuals_s[i,:] = s[i]-s_m
我得到你的(N,1,4):
In [39]: residuals_s=[]
In [40]: for i in range(len(s)):
....: residuals_s.append([])
....: tmp = s[i] - s_m
....: residuals_s[-1].append(tmp)
In [41]: residuals_s
Out[41]:
[[array([ 1.02649662, 0.43613824, 0.66276758, 2.0082684 ])],
[array([ 1.13000227, -0.94129685, 0.63411801, -0.383982 ])],
...]
In [43]: np.array(residuals_s).shape
Out[43]: (10, 1, 4)
此处s[i]-s_m
数组附加到空列表中,该列表已附加到主列表中。所以它是列表中列表中的数组。这个中间列表产生中间1
维度。
答案 1 :(得分:0)
你正在使用NumPy ndarray而不使用NumPy中的函数,sum()
是一个python内置函数,你应该使用numpy.sum()
。
我建议您将代码更改为:
import numpy as np
np.random.seed(0)
s = np.random.randn(10, 4)
s_m = np.mean(a, axis=0, keepdims=True)
residuals_s = s - s_m
print s.shape, s_m.shape, residuals_s.shape
使用mean()
函数与axis
和keepdims
参数将为您提供正确的结果。