【问题标题】:PySpark 2.2.0 : 'numpy.ndarray' object has no attribute 'indices'PySpark 2.2.0:“numpy.ndarray”对象没有属性“indices”
【发布时间】:2019-07-29 21:56:05
【问题描述】:

任务

我正在使用 Python API for Spark (PySpark) 计算 __SparseVector__ 内索引的大小。

脚本

def score_clustering(dataframe):
assembler = VectorAssembler(inputCols = dataframe.drop("documento").columns, outputCol = "variables")
data_transformed = assembler.transform(dataframe)
data_transformed_rdd = data_transformed.select("documento", "variables").orderBy(data_transformed.documento.asc()).rdd
count_variables = data_transformed_rdd.map(lambda row : [row[0], row[1].indices.size]).toDF(["id", "frequency"])

问题

当我在 __count_variables__ 数据帧上执行操作 __.count()__ 时,会出现错误:

AttributeError: 'numpy.ndarray' 对象没有属性 'indices'

要考虑的主要部分是:

data_transformed_rdd.map(lambda row : [row[0], row[1].indices.size]).toDF(["id", "frequency"])

我相信这个块与错误有关,但如果我通过映射 __lambda expression____SparseVector__ (创建__assembler__)。

有什么建议吗?有谁知道我做错了什么?

【问题讨论】:

    标签: python pyspark


    【解决方案1】:

    这里有两个问题。第一个在indices.size调用中,indicessizeSparseVector class的两个不同属性,size是完整的向量大小,indices是向量索引,其值为非零,但size 不是 indices 属性。所以,假设你所有的向量都是 SparseVector 类的实例:

    from pyspark.ml.linalg import Vectors
    
    df = spark.createDataFrame([(0, Vectors.sparse(4, [0, 1], [11.0, 2.0])),
                                (1, Vectors.sparse(4, [], [])),
                                (3, Vectors.sparse(4, [0,1,2], [2.0, 2.0, 2.0]))],
                               ["documento", "variables"])
    
    df.show()
    
    +---------+--------------------+
    |documento|           variables|
    +---------+--------------------+
    |        0|(4,[0,1],[11.0,2.0])|
    |        1|           (4,[],[])|
    |        3|(4,[0,1,2],[2.0,2...|
    +---------+--------------------+
    

    解决办法是len函数:

    df = df.rdd.map(lambda x: (x[0], x[1], len(x[1].indices)))\
                   .toDF(["documento", "variables", "frecuencia"])
    df.show()  
    +---------+--------------------+----------+
    |documento|           variables|frecuencia|
    +---------+--------------------+----------+
    |        0|(4,[0,1],[11.0,2.0])|         2|
    |        1|           (4,[],[])|         0|
    |        3|(4,[0,1,2],[2.0,2...|         3|
    +---------+--------------------+----------+
    

    第二个问题来了:VectorAssembler 并不总是生成 SparseVectors,取决于哪个更有效,可以生成 SparseVector 或 DenseVectors(基于原始向量具有的零的数量)。例如,假设下一个数据帧:

    df = spark.createDataFrame([(0, Vectors.sparse(4, [0, 1], [11.0, 2.0])),
                                 (1, Vectors.dense([1., 1., 1., 1.])),
                                  (3, Vectors.sparse(4, [0,1,2], [2.0, 2.0, 2.0]))], 
                               ["documento", "variables"])
    
    df.show()      
    +---------+--------------------+
    |documento|           variables|
    +---------+--------------------+
    |        0|(4,[0,1],[11.0,2.0])|
    |        1|   [1.0,1.0,1.0,1.0]|
    |        3|(4,[0,1,2],[2.0,2...|
    +---------+--------------------+
    

    文档 1 是 DenseVector 并且之前的解决方案不起作用,因为 DenseVectors 没有 indices 属性,因此您必须使用更通用的向量表示来处理包含稀疏和密集向量的 DataFrame,例如例如numpy:

    import numpy as np
    df = df.rdd.map(lambda x: (x[0], 
                               x[1], 
                               np.nonzero(x[1])[0].size))\
                    .toDF(["documento", "variables", "frecuencia"])
    df.show() 
    +---------+--------------------+----------+
    |documento|           variables|frecuencia|
    +---------+--------------------+----------+
    |        0|(4,[0,1],[11.0,2.0])|         2|
    |        1|   [1.0,1.0,1.0,1.0]|         4|
    |        3|(4,[0,1,2],[2.0,2...|         3|
    +---------+--------------------+----------+
    

    【讨论】:

    • 你好阿曼达。你的回答很有效。它解决了这个问题。我不知道您所说的:VectorAssembler 并不总是创建 SparseVectors,感谢您提供的信息。
    • VectorAssembler 根据每行零特征的数量生成 SparseVectors 或 DenseVectors。如果一行有很多零特征,那么将创建一个 SparseVector,但在相反的情况下(很多非零特征),则会生成一个 DenseVector,因为创建一个具有非零索引的元组和非零值。它可能会使用与原始特征向量大小相同的两个向量来复制消耗的内存。
    猜你喜欢
    • 2020-09-22
    • 2020-02-21
    • 2020-12-08
    • 2019-12-10
    • 2017-07-10
    • 2020-05-10
    • 2019-11-04
    • 2017-05-24
    • 2021-06-14
    相关资源
    最近更新 更多