Python np.数组的形状,意外的附加维度
我在用python处理数组,这引起了很多疑问 1) 我从N个文件中生成一个读取4列的列表,并在列表中存储4个元素N次。然后,我将此列表转换为numpy数组:Python np.数组的形状,意外的附加维度,python,arrays,numpy,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的行中减去平均向量s_m,我可以用两
s = np.array(s)
我想知道这个阵列的形状。答案是正确的:
print s.shape
#(N,4)
然后,我生成此Nx4阵列的平均值:
s_m = sum(s)/len(s)
print s_m.shape
#(4,)
我猜这意味着这个数组是一维数组。这是正确的吗
2) 如果我从数组s的行中减去平均向量s_m,我可以用两种方式进行:
residuals_s = s - s_m
或:
如果我现在问这两种情况下残差的形状,我会得到两个不同的答案。在第一种情况下,我得到:
(N,4)
在第二部分:
(N,1,4)
有人能解释为什么会有一个额外的维度吗?您使用的是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
参数一起使用将得到正确的结果。可以使用numpy方法获得平均值(生成相同的(4,)形状):
s-sum
之所以有效,是因为s\m
被“广播”到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)与:
这里,s[i]-s\m
数组被附加到一个空列表,该空列表已附加到主列表。所以它是一个列表中的数组。正是这个中间列表产生了中间的1
维度。s_m=sum(s)/len(s)
应该给出一个浮点。在正常情况下,您的输出对我来说很奇怪……我认为tmp具有形状(1,4)。因此,N个版本的tmp数组当然具有形状(N,1,4)。因此,我认为解决方案应该是使用类似于残差附加(tmp.reformate(-1))
的东西。
[array([ 1.02649662, 0.43613824, 0.66276758, 2.0082684 ]),
array([ 1.13000227, -0.94129685, 0.63411801, -0.383982 ]),
...]
residuals_s = np.zeros_like(s)
for i in range(s.shape[0]):
residuals_s[i,:] = s[i]-s_m
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)