再次审视ndarray扁平化相关函数,多维变一维函数区别
发布于 作者:苏南大叔 来源:程序如此灵动~由于目光再次回到了“数组扁平化/多维变一维”这个话题上,苏南大叔也写一下自己的最新感受和总结。不过本文的主体内容,想要先和奇葩的sklearn.utils.column_or_1d(a)
撇清关系,本文不讨论这个奇葩的只能扁平化部分数组的函数。只讨论以下三个函数.flatten()
、.ravel()
、.resharp()
。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。本文测试环境: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_. 存在 |
.resharp() | np. 存在 | ndarray_. 存在 |
差异点二
因为这里是以“多维变一维”的相关函数为主要叙述目标的。所以,重点对比下面的三个函数.ravel()
、.flatten()
、.resharp()
。主要对比的点是函数返回值。
.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() | 引用 |
.resharp() | 引用 |
差异点三
对于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
相关经验文章,请点击下面的链接:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。