[英]Apply Function to every group: TypeError: unhashable type: 'numpy.ndarray'
[英]Lambda function - TypeError: unhashable type: 'numpy.ndarray'
我有一个numpy的2-D数组,每一列都有分类数据。
我尝试在每一列分别编码数据,同时可能在每种情况下处理看不见的数据。
我有以下代码:
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])
我得到这个错误:
---------------------------------------------------------------------------
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'
我怎样才能解决这个问题?
一般来说,您会建议一种更好的方式来做我想做的事吗?
PS
我试图这样做以查看发生了什么:
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()
但是实际上print(X_test[i, column])
没有打印任何内容print(X_test[i, column])
所以我不确定X_test[:, column]
是否有任何numpy数组。
实际上,我还检查了if not isinstance(X_test[i, column],str)
并再次未打印任何内容,因此每column
X_train[:, column]
中的所有内容都必须是字符串。
PS2
当我这样做时:
for i in range(X_test[:, column].shape[0]):
X_test[i, column] = mappings.get(X_test[i, column], -1)
它实际上没有错误,因此这意味着出于某种原因,我已经定义了lambda
函数,因此我将整个numpy数组发送给了它,而不是单独将其元素发送给了它。
在这里发生的是,发送给map_function
是实际向量,该向量不能用作字典中的键,因为它不可散列,因此会产生错误。
切换行
map_function = lambda x: mappings.get(x, -1)
同
map_function = np.vectorize(lambda x: mappings.get(x, -1))
这将导致每个元素都被用作映射中的键,并且如果所有元素确实都是可哈希的,它将起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.