我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

numpy里面的squeeze()函数是个用于降维的函数,它并不是对所有的ndarray都可以生效,而是仅对其中有特定特征的数组生效。只可以对拥有单维度条目的数组起作用。那么,什么样的ndarray是单维度的呢?np.squeeze()的效果是如何的呢?这就是本文要讨论的内容。

苏南大叔:python如何利用numpy.squeeze()函数降维单维度条目数组? - squeeze降维
python如何利用numpy.squeeze()函数降维单维度条目数组?(图1-1)

苏南大叔的“程序如此灵动”技术博客,记录苏南大叔的代码经验总结。本文测试环境:win10python@3.11.0numpy@1.24.2

单维度条目

啥样的是单维度条目呢?这个要从ndarrayshape说起。有两个判断标准

  • 形状信息中,如果出现了1的字样,那么它就是本文的目标对象。
  • 如果打印ndarray,出现了[[x]]的类似信息,那么也很有可能是本文的目标对象。

可以生成这样的目标数组:

import numpy as np

s = np.arange(6).reshape(1, 6)
x = np.arange(6).reshape(2, 3)

第一个变量sshape信息里面,有1的字样,所以是目标变量。
第二个变量xshape信息里面,没有1的字样,所以不是目标变量。

降维

降维,不是降一维,也不是降到一维。参考代码:

import numpy as np

s = np.arange(6).reshape(1, 6)
x = np.arange(6).reshape(2, 3)

import numpy as np

s = np.arange(6).reshape(1, 6)
n = np.array([[[0], [1], [2]]])
o = np.arange(10).reshape(2, 1, 5)
k = np.arange(20).reshape(2, 1, 5, 1, 2)
x = np.arange(6).reshape(2, 3)

ss = np.squeeze(s)
nn = np.squeeze(n)
oo = np.squeeze(o)
kk = np.squeeze(k)
xx = np.squeeze(x)

print(s.shape, "=>", ss.shape, np.array_equal(ss, s), "\r\n")
print(s, "\r\n", ss, "\r\n" * 5)

print(n.shape, "=>", nn.shape, np.array_equal(nn, n), "\r\n")
print(n, "\r\n", nn, "\r\n" * 5)

print(o.shape, "=>", oo.shape, np.array_equal(oo, o), "\r\n")
print(o, "\r\n", oo, "\r\n" * 5)

print(k.shape, "=>", kk.shape, np.array_equal(kk, k), "\r\n")
print(k, "\r\n", kk, "\r\n" * 5)

print(x.shape, "=>", xx.shape, np.array_equal(xx, x), "\r\n")
print(x, "\r\n", xx, "\r\n" * 5)

输出:
个别的ndarray经过np.squeeze()处理后,确实有多维变一维的效果。但是并不是全部。

(1, 6) => (6,) False
[[0 1 2 3 4 5]]
 [0 1 2 3 4 5]

下面的是个竖直的多维变一维的例子,但,这也不是全部。不能以偏概全。

(1, 3, 1) => (3,) False
[[[0]
  [1]
  [2]]]
 [0 1 2]
(2, 1, 5) => (2, 5) False
[[[0 1 2 3 4]]

 [[5 6 7 8 9]]]

 [[0 1 2 3 4]
 [5 6 7 8 9]]
(2, 1, 5, 1, 2) => (2, 5, 2) False

[[[[[ 0  1]]

   [[ 2  3]]

   [[ 4  5]]

   [[ 6  7]]

   [[ 8  9]]]]



 [[[[10 11]]

   [[12 13]]

   [[14 15]]

   [[16 17]]

   [[18 19]]]]]


 [[[ 0  1]
  [ 2  3]
  [ 4  5]
  [ 6  7]
  [ 8  9]]

 [[10 11]
  [12 13]
  [14 15]
  [16 17]
  [18 19]]]

下面的这个因为shape里面没有1,所以没有降维成功。

(2, 3) => (2, 3) True
[[0 1 2]
 [3 4 5]]
 [[0 1 2]
 [3 4 5]]

axis轴向

import numpy as np

e = np.arange(3).reshape(1, 3, 1)
print(e)

ee = np.squeeze(e)
print(ee)

e0 = np.squeeze(e, axis=0)
print(e0)

# ValueError: cannot select an axis to squeeze out which has size not equal to one
# e1 = np.squeeze(e,axis = 1)  # 报错

e2 = np.squeeze(e, axis=2)
print(e2)

输出:
原版:

[[[0]
  [1]
  [2]]]

默认,降维所有轴向:

[0 1 2]

降维轴向为0:

[[0]
 [1]
 [2]]

降维轴向为2:

[[0 1 2]]

axis轴向为负数

个人理解,为负数就是从后面数数的意思。-1意思就是最后一个,倒数第一个。

import numpy as np

s = np.array([[[[0], [1], [2]]]])
print(s.shape)  # (1, 1, 3, 1)
ss = np.squeeze(s, axis=-1)
print(ss.shape)  # (1, 1, 3)
ss = np.squeeze(s, axis=(-1, 0, 1))
print(ss.shape)  # (3,)
ss = np.squeeze(s)
print(ss.shape)  # (3,)

axis还可以设置为一个tuple,写上所有需要处理的轴向。

参考文章

结束语

这个np.squeeze()主要用于在科学计算中,在画图之前整理数据。因为在科学计算中,经常会出现单维度的数据,这些信息在plot画图中,是空白,无法画出来。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python