我正在尝试在数据列表中使用函数(preprocessing.scale)。我是Python中mapreduce / parallelism的新手 - 我想在一大堆数据上处理这个以提高性能。
示例:
X = [1,2,3,4]
使用语法:
list(map(preprocessing.scale, X))
我收到此错误:
TypeError: Singleton array array(1.0) cannot be considered a valid collection.
我认为这是因为该函数的返回类型,但我不知道如何解决这个问题。任何帮助将不胜感激!
答案 0 :(得分:1)
您不需要/想要使用地图功能,因为它是for loop
。
几乎所有的sklearn
方法都是矢量化的,它们接受列表相似的对象(列表,numpy数组等),与map(...)
方法相比,这种方法的工作速度要快得多
演示:
In [121]: from sklearn.preprocessing import scale
In [122]: X = [1,2,3,4]
In [123]: scale(X)
Out[123]: array([-1.34164079, -0.4472136 , 0.4472136 , 1.34164079])
使用numpy数组的相同演示:
In [39]: x = np.array(X)
In [40]: x
Out[40]: array([1, 2, 3, 4])
In [41]: scale(x)
DataConversionWarning: Data with input dtype int32 was converted to float64 by the scale function.
warnings.warn(msg, _DataConversionWarning)
Out[41]: array([-1.34164079, -0.4472136 , 0.4472136 , 1.34164079])
它期望float dtype,所以我们可以轻松地将我们的numpy数组转换为float dtype:
In [42]: scale(x.astype('float64'))
Out[42]: array([-1.34164079, -0.4472136 , 0.4472136 , 1.34164079])
答案 1 :(得分:0)
执行list(map(preprocessing.scale, X))
相当于执行[preprocessing.scale(a) for a in X]
。
鉴于此,你目前正在做的是缩放单例(一个观察)。您无法缩放单个项目,这是该功能中断的位置。尝试preprocessing.scale(X[0])
,你会得到同样的错误。
尝试像这样运行它的目的是什么,而不是仅仅传递数组X preprocessing.scale(X)
?