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

30 python numpy

很多时候,数组被挤压np.squeeze().它说,在文档中

从a的形状中删除一维条目.

但是我一直在想:为什么在一个形状为零,无量纲项?或者换种方式:为什么都a.shape = (2,1) (2,)存在?

小智 26

这可以帮助您摆脱无用的一维数组,例如 using [7,8,9]代替[[[7,8,9]]][[1,2,3],[4,5,6]]代替[[[[1,2,3],[4,5,6]]]]。例如,从教程点检查此链接


Chr*_*oph 23

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

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

同样,在禅宗的精神中Explicit is better than implicit,我们也可以说我们应该更喜欢显式squeeze到隐式数组转换.


ben*_*enj 6

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

例如

>>> x = np.ones((2, 1))*2
>>> y = np.ones((2, 1))*3
>>> x.shape
(2,1)
>>> x*y
array([[ 6.],
       [ 6.]])
Run Code Online (Sandbox Code Playgroud)

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

>>> z = np.ones((2,))*3
>>> x*z
array([[ 6.,  6.],
       [ 6.,  6.]])
Run Code Online (Sandbox Code Playgroud)

其次,您也可能想要将早期维度egashape =(1,2,2)压缩为a.shape =(2,2)


小智 5

压缩(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.]
Run Code Online (Sandbox Code Playgroud)

(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)
Run Code Online (Sandbox Code Playgroud)