如何理解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
相关文章,请点击:


