【问题标题】:How do I use Python's map function with sklearn's preprocessing.scale?如何将 Python 地图函数与 sklearn preprocessing.scale 一起使用?
【发布时间】:2017-11-05 06:49:30
【问题描述】:

我正在尝试对数据列表使用函数 (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.

我认为这是因为函数的返回类型,但我不知道如何解决这个问题。任何帮助将不胜感激!

【问题讨论】:

  • Python 内置的 map 函数与 map/reduce 并行度无关。

标签: python mapreduce scikit-learn sklearn-pandas


【解决方案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])

【讨论】:

  • 如果您在代码旁边包含解释,这个答案会好得多。完全不清楚这个答案是否响应了这个问题,因为你根本不谈论地图功能。
  • @SamHartman,感谢您的评论!我已经更新了我的答案 - 我希望它更清楚......
  • @MaxU 谢谢 :)
【解决方案2】:

执行list(map(preprocessing.scale, X))等价于执行[preprocessing.scale(a) for a in X]

鉴于此,您目前正在做的是缩放单例(一个观察结果)。您无法缩放单个项目,这就是功能中断的地方。尝试做preprocessing.scale(X[0]),你会得到同样的错误。

您尝试这样运行它而不只是传递数组 X preprocessing.scale(X) 的目的是什么?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-29
    • 2021-12-26
    • 2022-08-08
    • 2019-05-02
    • 1970-01-01
    • 2014-03-03
    • 2021-06-22
    • 2013-12-11
    相关资源
    最近更新 更多