python如何利用numpy.squeeze()函数降维单维度条目数组?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
numpy
里面的squeeze()
函数是个用于降维的函数,它并不是对所有的ndarray
都可以生效,而是仅对其中有特定特征的数组生效。只可以对拥有单维度条目的数组起作用。那么,什么样的ndarray
是单维度的呢?np.squeeze()
的效果是如何的呢?这就是本文要讨论的内容。
苏南大叔的“程序如此灵动”技术博客,记录苏南大叔的代码经验总结。本文测试环境:win10
,python@3.11.0
,numpy@1.24.2
。
单维度条目
啥样的是单维度条目呢?这个要从ndarray
的shape
说起。有两个判断标准
- 形状信息中,如果出现了
1
的字样,那么它就是本文的目标对象。 - 如果打印
ndarray
,出现了[[x]]
的类似信息,那么也很有可能是本文的目标对象。
可以生成这样的目标数组:
import numpy as np
s = np.arange(6).reshape(1, 6)
x = np.arange(6).reshape(2, 3)
第一个变量s
的shape
信息里面,有1
的字样,所以是目标变量。
第二个变量x
的shape
信息里面,没有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
,写上所有需要处理的轴向。
参考文章
- https://numpy.org/doc/stable/reference/generated/numpy.squeeze.html
- https://newsn.net/say/python-ndarray.html
- https://newsn.net/say/ndarray-expand_dims.html 【升维逻辑见这里】
结束语
这个np.squeeze()
主要用于在科学计算中,在画图之前整理数据。因为在科学计算中,经常会出现单维度的数据,这些信息在plot
画图中,是空白,无法画出来。
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。