Lambda 函数 - 类型错误:不可散列的类型:'numpy.ndarray'

Poe*_*dit 2 python lambda encoding numpy categorical-data

我有一个 numpy 二维数组,每列都有分类数据。

我尝试对每列的数据进行单独编码,同时可能在每种情况下处理看不见的数据。

我有这个代码:

from sklearn.preprocessing import LabelEncoder

for column in range(X_train.shape[1]):

    label_encoder = LabelEncoder()

    X_train[:, column] = label_encoder.fit_transform(X_train[:, column])

    mappings = dict(zip(label_encoder.classes_, label_encoder.transform(label_encoder.classes_)))

    map_function = lambda x: mappings.get(x, -1)

    X_test[:, column] = map_function(X_test[:, column])
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-***********> in <module>
     39         mappings = dict(zip(label_encoder.classes_, label_encoder.transform(label_encoder.classes_)))
     40         map_function = lambda x: mappings.get(x, -1)
---> 41         X_test[:, column] = map_function(X_test[:, column])
     42 
     43 

<ipython-input-***********> in <lambda>(x)
     38         X_train[:, column] = label_encoder.fit_transform(X_train[:, column])
     39         mappings = dict(zip(label_encoder.classes_, label_encoder.transform(label_encoder.classes_)))
---> 40         map_function = lambda x: mappings.get(x, -1)
     41         X_test[:, column] = map_function(X_test[:, column])
     42 

TypeError: unhashable type: 'numpy.ndarray'
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

一般来说,您会建议一种更好的方法来做我想做的事情吗?

聚苯乙烯

我尝试这样做来看看发生了什么:

for column in range(X_train.shape[1]):
    label_encoder = LabelEncoder()
    X_train[:, column] = label_encoder.fit_transform(X_train[:, column])
    mappings = dict(zip(label_encoder.classes_, label_encoder.transform(label_encoder.classes_)))

    try:
        map_function = lambda x: mappings.get(x, -1)
        X_test[:, column] = map_function(X_test[:, column])
    except:
        print(X_test[:, column])
        for i in range(X_test[:, column].shape[0]):
            if isinstance(X_test[i, column],np.ndarray):
                print(X_test[i, column])
        print()
Run Code Online (Sandbox Code Playgroud)

但实际上没有打印任何内容,print(X_test[i, column])所以我不确定 中是否有任何 numpy 数组X_test[:, column]

我实际上也检查过,if not isinstance(X_test[i, column],str)并且再次没有打印任何内容,因此X_train[:, column]每个中的所有内容都column必须是字符串。

PS2

当我这样做时:

 for i in range(X_test[:, column].shape[0]):
     X_test[i, column] = mappings.get(X_test[i, column], -1)
Run Code Online (Sandbox Code Playgroud)

它实际上没有错误,所以这意味着由于某种原因,我定义函数的方式lambda是将整个 numpy 数组发送给它,而不是单独发送它的元素。

blu*_*ers 5

这里发生的情况是,发送到的map_function是实际向量,它不能用作字典中的键,因为它不可散列,因此会出现错误。

切换行

map_function = lambda x: mappings.get(x, -1)

map_function = np.vectorize(lambda x: mappings.get(x, -1))

这将导致每个元素都被用作映射中的键,并且如果所有元素确实都是可散列的,那么它就可以工作。