如何理解sklearn工具函数column_or_1d()?检测数据并转换
发布于 作者:苏南大叔 来源:程序如此灵动~
sklearn.utils里面有个看上去很散装的函数.column_or_1d(),它是用来做什么的呢?如何使用.column_or_1d()呢?这个函数的功用是:将特定的多维ndarray数组扁平化处理转换为一维数组,具体的可以参考苏南大叔在本文中的描述。

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。本文测试环境:win10,python@3.12.0,scikit-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类型,是没有ndim和shape属性的,但是可以脑补对不?
| 数据 | ndim | shape | utils.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相关文章,请点击: