再次审视ndarray扁平化相关函数,多维变一维函数区别
发布于 作者:苏南大叔 来源:程序如此灵动~
由于目光再次回到了“数组扁平化/多维变一维”这个话题上,苏南大叔也写一下自己的最新感受和总结。不过本文的主体内容,想要先和奇葩的sklearn.utils.column_or_1d(a)撇清关系,本文不讨论这个奇葩的只能扁平化部分数组的函数。只讨论以下三个函数.flatten()、.ravel()、.reshape()。

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。本文测试环境:win10,python@3.12.0,numpy@1.26.1,scikit-learn@1.2.2。
前文回顾
苏南大叔描述过对ndarray类型的扁平化处理方式,以及对list类型的扁平化处理方式。参考文章:
本文就是基于这两篇文章进行讨论的。
差异点一
经过反反复复的经验总结,苏南大叔可以得出的经验值是:很多【并不是全部】numpy的函数,都有两个使用方式。一个是定义在numpy上,另外一个定义在ndarray类型的变量上。
然而,对于数组扁平化这件事情来说,上文的经验总结的几个函数来说,却存在着主体差异。
| 函数方法 | 定义在numpy库上 | 定义在ndarray数据类型上 |
|---|---|---|
.flatten() | np.不存在 | ndarray_.存在 |
.ravel() | np.存在 | ndarray_.存在 |
.reshape() | np.存在 | ndarray_.存在 |
差异点二
因为这里是以“多维变一维”的相关函数为主要叙述目标的。所以,重点对比下面的三个函数.ravel()、.flatten()、.reshape()。主要对比的点是函数返回值。
.flatten()的返回值是个副本,和原版的被操作变量无关。
import numpy as np
x = np.array([["苏","南"], ["大","叔"]])
x.flatten()[3] = "哥"
print(x)
'''
[['苏' '南']
['大' '叔']]
'''.ravel()的返回值是个引用,和原版的被操作变量就是同一个变量。
import numpy as np
x = np.array([["苏","南"], ["大","叔"]])
x.ravel()[3] = "哥"
print(x)
'''
[['苏' '南']
['大' '哥']]
'''
x = np.array([["苏","南"], ["大","叔"]])
np.ravel(x)[3] = "哥"
print(x)
'''
[['苏' '南']
['大' '哥']]
'''.reshape()的返回值也是个引用,和原版的被操作变量就是同一个变量。
import numpy as np
x = np.array([["苏","南"], ["大","叔"]])
x.reshape(-1)[3]="哥"
print(x)
'''
[['苏' '南']
['大' '哥']]
'''
x = np.array([["苏","南"], ["大","叔"]])
np.reshape(x,-1)[3]="哥"
print(x)
'''
[['苏' '南']
['大' '哥']]
'''| 函数方法 | 返回值 |
|---|---|
.flatten() | 副本 |
.ravel() | 引用 |
.reshape() | 引用 |
差异点三
对于np.,可以操作的对象可以是ndarray,也可以是list/tuple等类数组类型。而ndarray_.则必然只可操作ndarray,在list类型后面试图做类似操作的话,会直接报错无此方法。
list类型总是可以关联上tuple类型,两者大多数情况下共进退。但是关联到set类型时,往往会出错。
import numpy as np
a = np.array([["苏","南","大","叔"],["技","术","博","客"]])
a = [["苏","南","大","叔"],["技","术","博","客"]]
a = (["苏","南","大","叔"],["技","术","博","客"])
b = np.ravel(a).tolist() # ['苏' '南' '大' '叔' '技' '术' '博' '客']
c = np.reshape(a,-1).tolist() # ['苏' '南' '大' '叔' '技' '术' '博' '客']
print(b,c)相关文章
结语
更多苏南大叔的python相关经验文章,请点击下面的链接: