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

sklearn.utils里面有个看上去很散装的函数.column_or_1d(),它是用来做什么的呢?如何使用.column_or_1d()呢?这个函数的功用是:将特定的多维ndarray数组扁平化处理转换为一维数组,具体的可以参考苏南大叔在本文中的描述。

苏南大叔:如何理解sklearn工具函数column_or_1d()?检测数据并转换 - sklearn工具函数column_or_1d
如何理解sklearn工具函数column_or_1d()?检测数据并转换(图1-1)

苏南大叔的“平行空间笔记本”博客,记录苏南大叔的代码编程经验总结。本文测试环境:win10python@3.12.0scikit-learn@1.3.2.column_or_1d(y)y转换为一维数组,如果warn=true,则会在转换时发出警告。在sklearn里面,用于转换处理样本的y标签。例如:鸢尾花数据集的target

相似之处:数组扁平化

以前有文章对ndarray数组扁平化操作有过专门的探讨。参考文章:

这里并不是以数组扁平化为主要讨论内容的,所以,这里仅作范例:

import numpy as np
a = np.array([["苏"],["南"],["大"],["叔"]])
print(np.ravel(a))                 #  ['苏' '南' '大' '叔']

在最好的情况下,.column_or_1d()的函数效果,就是和以前讨论的数组扁平化的效果一致的。

import numpy as np
a = np.array([["苏"],["南"],["大"],["叔"]])
import sklearn;
b = sklearn.utils.column_or_1d(a)   # ['苏' '南' '大' '叔']
print(b)

不同之处:只能扁平化一部分数组

.column_or_1d()只能扁平化一部分数组。举例:

import numpy as np
a = [["苏"],["南"],["大"],["叔"]]
a = np.array([["苏"],["南"],["大"],["叔"]])

a = np.array([[["苏"]],[["南"]],[["大"]],[["叔"]]])   
# ValueError: Found array with dim 3. None expected <= 2.
a = np.array([[["苏","南"]],[["大","叔"]]])           
# ValueError: Found array with dim 3. None expected <= 2.
a = np.array([["苏","南","大","叔"]])                 
# ValueError: y should be a 1d array, got an array of shape (1, 4) instead.

import sklearn;
b = sklearn.utils.column_or_1d(a)
print(b)

而这些在sklearn.utils.column_or_1d(a)报错【注意是报错】的情况,在以前的情况下,这些变量都是可以正常扁平化的。

.column_or_1d()会发出警告

在那些能被正常扁平化的数据里面,有一些是会被触发警告【主要是警告】信息的。例如:

import numpy as np
a = np.array(["苏","南","大","叔"])  
a = ["苏","南","大","叔"]              
a = np.array([["苏"],["南"],["大"],["叔"]])             # DataConversionWarning
a = [["苏"],["南"],["大"],["叔"]]                       # DataConversionWarning
import sklearn;
b = sklearn.utils.column_or_1d(a,warn=True)            # ['苏' '南' '大' '叔']
print(b)

输出警告信息:

DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().

表格总结

目标数据是['苏' '南'] <class 'numpy.ndarray'>。表格中的list类型,是没有ndimshape属性的,但是可以脑补对不?

数据ndimshapeutils.column_or_1d()np.ravel()
np.array(["苏","南"])1(2,)["苏","南"](ndarray)["苏","南"](ndarray)
["苏","南"]1(2,)["苏","南"](ndarray)["苏","南"](ndarray)
np.array([["苏"],["南"]])2(2,1)["苏","南"] + warning["苏","南"](ndarray)
[["苏"],["南"]]2(2,1)["苏","南"] + warning["苏","南"](ndarray)
np.array([["苏","南"]])2(1,2)error["苏","南"](ndarray)
[["苏","南"]]2(1,2)error["苏","南"](ndarray)
np.array([[["苏"]],[["南"]]])3(2,1,1)error["苏","南"](ndarray)
[[["苏"]],[["南"]]]3(2,1,1)error["苏","南"](ndarray)

基本上可以这么理解的:

  • 只有原版就是扁平化的,才不会触发错误或者警告信息。
  • 原版如果是竖直方向的扁平,则会触发警告信息,不会触发错误信息。

测试代码:

import numpy as np

a = ["苏","南"]
a = [["苏"],["南"]]
a = [["苏","南"]]

if(type(a)==np.ndarray):
    print(a.ndim,a.shape)
else:
    tmp = np.array(a)
    print(tmp.ndim,tmp.shape)
    pass

import sklearn;
b = sklearn.utils.column_or_1d(a,warn=True)            # ['苏' '南' '大' '叔']
print(b,type(b))

这个sklearn.utils.column_or_1d(a)的存在意义,更多的是检测,而不是转换吧?比较奇葩的函数,令苏南大叔想起了assert断言函数。

题外话

需要注意的是.column_or_1d()来自于sklearn.utils,以前苏南大叔还写过一个.bunch()也是来自sklearn.utils。参考文章:

结语

这个好像是第一个sklearn里面的和预测没有啥直接关系的文章吧?更多sklearn相关文章,请点击:

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

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

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

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