np.arrays的形状,意想不到的额外维度

时间:2014-04-19 02:15:23

标签: python arrays numpy

我在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)

有人可以解释为什么还有其他维度吗?

2 个答案:

答案 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()函数与axiskeepdims参数将为您提供正确的结果。