Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python np.数组的形状,意外的附加维度_Python_Arrays_Numpy - Fatal编程技术网

Python np.数组的形状,意外的附加维度

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,我可以用两

我在用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,我可以用两种方式进行:

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)