我有以下代码。我想尝试不同的特征选择算法而不重复两次相同的代码,因此,我将函数名称放入列表中,并编写了以下代码以查看其是否有效。是的。
我的问题是,列表如何将函数名称作为其项,以及它如何在for循环中正常工作?
from sklearn.datasets import load_digits
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.feature_selection import mutual_info_classif
X, y = load_digits(return_X_y=True)
list=[mutual_info_classif,chi2]
for i in list:
print(type(i))
X_new = SelectKBest(i, k=20).fit_transform(X, y)
print(X_new)
print('hello')
*输出**
<class 'function'>
[[ 5. 13. 15. ... 6. 0. 0.]
[ 0. 0. 9. ... 0. 10. 0.]
[ 0. 3. 14. ... 0. 16. 9.]
...
[ 1. 13. 2. ... 2. 6. 0.]
[ 2. 14. 15. ... 5. 12. 0.]
[10. 16. 1. ... 8. 12. 1.]]
hello
<class 'function'>
[[ 1. 0. 15. ... 6. 0. 0.]
[ 5. 0. 9. ... 0. 10. 0.]
[12. 0. 14. ... 0. 16. 9.]
...
[ 1. 0. 2. ... 2. 6. 0.]
[ 0. 0. 15. ... 5. 12. 0.]
[ 1. 0. 1. ... 8. 12. 1.]]
hello
答案 0 :(得分:2)
您并不是将函数的“名称”直接放入列表中。函数是对象,就像Python中的所有其他对象一样。当使用def
语句创建函数对象时,将其绑定到名称,就像使用=
一样,并设置对象的__name__
属性。当您将这些名称放在列表中时,该列表包含对函数对象的引用,您以后可以调用它们。
for
循环将引用与名称i
绑定在一起。您可能还需要打印i.__name__
和type(i)
来查看每次迭代将传递给SelectKBest
的函数。
在Python中以这种方式处理函数是相当普遍的。函数和其他可调用对象可放入列表,字典,元组以及几乎任何其他数据结构中。自functions are hashable起,它们甚至可以用作字典键或放在集合中。您还可以仅通过分配属性来将其添加到功能对象。