Spark SparseVector修剪零元素

时间:2015-11-19 02:11:27

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

我知道通常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实现中用默认值表示?

1 个答案:

答案 0 :(得分:3)

例如:

Datagrid

在Scala中,最简单的方法是使用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}) 方法:

toSparse
  

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

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