首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >火花SparseVector削减零个元素

火花SparseVector削减零个元素
EN

Stack Overflow用户
提问于 2015-11-19 02:11:27
回答 1查看 1.2K关注 0票数 0

我知道在星火SparseVector中通常不应该有任何零元素,因为它是由默认值(0.0)表示的,但是如果我用下面的代码创建了一个SparseVector

代码语言:javascript
复制
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下面,如下所示:

代码语言:javascript
复制
SparseVector(5, {1: 1.0, 3: 2.0})

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

EN

回答 1

Stack Overflow用户

发布于 2015-11-19 08:51:08

例如:

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
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实现中,它实际上也是由默认值表示的?

如果向量是用零索引显式创建的,那么这些零元素占用空间。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33794055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档