为什么我们需要np.squeeze()?

时间:2016-01-25 10:45:02

标签: python numpy

通常,数组会被np.squeeze()挤压。在文档中,它说

  

从。

的形状中删除一维条目

但是我仍然想知道:为什么零和非维度条目的形状?或者换句话说:为什么a.shape = (2,1) (2,)都存在?

4 个答案:

答案 0 :(得分:20)

除了两者之间的数学差异外,还存在可预测性问题。如果遵循了您的建议,您就无法依赖阵列的维度。因此,my_array[x,y]形式的任何表达式都需要首先检查my_array是否实际上是二维的,并且在某些时候没有隐式squeeze。这可能会比偶然的squeeze更加模糊代码,而Explicit is better than implicit会做一个明确指定的事情。

实际上,甚至可能很难说,哪个轴已被删除,导致一系列新问题。

本着The Zen of Python的精神,也squeeze,我们也可以说我们应该更明确MySQL running - 5.5.24 DB size: 3 tables with 200 M each DB is running on AWS ec2 with 16GB RAM on server. 8GB been allocated to MySQL. 来进行隐式数组转换。

答案 1 :(得分:5)

重要性的一个例子是乘法数组。两个二维数组将一次乘以每个值

e.g。

{ >= | > | < | <= | != }

如果将1d数组乘以2d数组,则行为不同

>>> x = np.ones((2, 1))*2
>>> y = np.ones((2, 1))*3
>>> x.shape
(2,1)
>>> x*y
array([[ 6.],
       [ 6.]])

其次,您也可能想要挤压较早的尺寸,例如a.shape =(1,2,2)到a.shape =(2,2)

答案 2 :(得分:2)

挤压(2,1)数组时,得到的(2,)既可以用作(2,1),也可以用作(1,2):

>>> a = np.ones(2)
>>> a.shape
(2,)
>>> a.T.shape
(2,)
>>> X = np.ones((2,2))*2
>>> np.dot(a,X)
[4. 4.]
>>> np.dot(X,a)
[4. 4.]

使用(2,1)数组不会发生这种情况:

>>> b = np.ones((2,1))
>>> np.dot(b,X)
Traceback (most recent call last):
ValueError: shapes (2,1) and (2,2) not aligned: 1 (dim 1) != 2 (dim 0)

答案 3 :(得分:1)

如果像使用这样的无用一维数组,这可以帮助您骑行 [7,8,9]代替了[[[7,8,9]] 或[[1,2,3],[4,5,6]]代替[[[[1,2,3],[4,5,6]]]] 例如,从教程上检查此链接 https://www.tutorialspoint.com/numpy/numpy_squeeze.htm