我知道通常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
实现中用默认值表示?
答案 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,则这些零元素占用空间。