【问题标题】:Spark SparseVector trim down zero elementsSpark SparseVector 修剪零元素
【发布时间】:2015-11-19 02:11:27
【问题描述】:

我知道在 Spark SparseVector 中通常不应该有任何零元素,因为它是默认值 (0.0),但在我使用以下代码创建 SparseVector 的情况下:

In : Vectors.sparse(5, [0, 1, 3, 5], [0.0, 1, 2, 0.0])
Out: SparseVector(5, {0: 0.0, 1: 1.0, 3: 2.0, 5: 0.0})

然后我可以有一个包含零个元素的SparseVector

我的问题是如何将可以用默认值表示的零元素从上面删除到下面的SparseVector 中,如下所示:

SparseVector(5, {1: 1.0, 3: 2.0})

此外,SparseVector 中的零元素是否占用任何空间?或者它实际上也在 SparseVector 实现中用默认值表示?

【问题讨论】:

  • 关于为什么我创建这样一个带有零的SparseVector:源数据(一个数组的字典,通过扔掉它的所有键)包含许多零,我无法弄清楚它的零的位置并同时保持其索引不变)

标签: python apache-spark apache-spark-sql pyspark apache-spark-mllib


【解决方案1】:

例如这样:

from pyspark.mllib.linalg import Vectors, SparseVector, DenseVector

def drop_zeros(x):
    """
    >>> drop_zeros(DenseVector([1.0, 0.0]))
    SparseVector(2, {0: 1.0})
    >>> drop_zeros(SparseVector(3, {0: 0.0, 1: 2.0, 2: 0.0}))
    SparseVector(3, {1: 2.0})
    """
    if isinstance(x, SparseVector):
        return SparseVector(
            x.size, {i: v for i, v in zip(x.indices, x.values) if v})
    if isinstance(x, DenseVector):
        return SparseVector(
            len(x), {i: v for i, v in enumerate(x.array) if v})
    raise TypeError("Invalid type {0}".format(type(x)))

sparse_with_zeros = Vectors.sparse(5, [0, 1, 3, 5], [0.0, 1, 2, 0.0])
drop_zeros(sparse_with_zeros)

## SparseVector(5, {1: 1.0, 3: 2.0})

dense_with_zeros = DenseVector([1.0, 3.0, 0.0, 2.0, 0.0])
## SparseVector(5, {0: 1.0, 1: 3.0, 3: 2.0})

在 Scala 中,最简单的方法是使用toSparse 方法:

import org.apache.spark.mllib.linalg.{Vectors, DenseVector, SparseVector}

val sparse_with_zeros = Vectors.sparse(3, Array(0, 1, 2), Array(0.0, 1.0, 0.0))
sparse_with_zeros.toSparse
// org.apache.spark.mllib.linalg.SparseVector = (3,[1],[1.0])

此外,SparseVector 中的零元素是否占用任何空间?或者它实际上也在 SparseVector 实现中由默认值表示?

如果使用零索引显式创建向量,则这些零元素占用空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2020-08-16
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 2011-08-04
    相关资源
    最近更新 更多