是否有内置的方法可以从 PySpark 中的密集向量创建稀疏向量?我这样做的方式如下:
Vectors.sparse(len(denseVector), [(i,j) for i,j in enumerate(denseVector) if j != 0 ])
Run Code Online (Sandbox Code Playgroud)
这满足 [size, (index, data)] 格式。似乎有点hacky。有没有更有效的方法来做到这一点?
小智 6
import scipy.sparse
from pyspark.ml.linalg import Vectors, _convert_to_vector, VectorUDT
from pyspark.sql.functions import udf, col
Run Code Online (Sandbox Code Playgroud)
如果您只有一个密集向量,则可以这样做:
def dense_to_sparse(vector):
return _convert_to_vector(scipy.sparse.csc_matrix(vector.toArray()).T)
dense_to_sparse(densevector)
Run Code Online (Sandbox Code Playgroud)
这里的技巧是 csc_matrix.shape[1] 必须等于 1,所以转置向量。看看_convert_to_vector的来源:https ://people.eecs.berkeley.edu/~jegonzal/pyspark/_modules/pyspark/mllib/linalg.html
更可能的情况是你有一个带有密集向量列的 DF:
to_sparse = udf(dense_to_sparse, VectorUDT())
DF.withColumn("sparse", to_sparse(col("densevector"))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2978 次 |
| 最近记录: |