Pysp中SparseVector到DenseVector的转换

2024-04-20 02:23:15 发布

您现在位置:Python中文网/ 问答频道 /正文

在PySpark 1.4.1中将SparseVector转换为DenseVector时出现意外错误:

from pyspark.mllib.linalg import SparseVector, DenseVector

DenseVector(SparseVector(5, {4: 1.}))

这在Ubuntu上正常运行,运行pyspark,返回:

DenseVector([0.0, 0.0, 0.0, 0.0, 1.0])

这会导致RedHat出错,运行pyspark,返回:

Traceback (most recent call last): File "", line 1, in File "/usr/lib/spark/python/pyspark/mllib/linalg.py", line 206, in init ar = np.array(ar, dtype=np.float64) File "/usr/lib/spark/python/pyspark/mllib/linalg.py", line 673, in getitem raise ValueError("Index %d out of bounds." % index) ValueError: Index 5 out of bounds.


此外,在两个平台上,评估以下内容也会导致错误:

DenseVector(SparseVector(5, {0: 1.}))

我希望:

DenseVector([1.0, 0.0, 0.0, 0.0, 0.0])

但是得到:

  • 乌班图:

Traceback (most recent call last): File "", line 1, in File "/home/skander/spark-1.4.1-bin-hadoop2.6/python/pyspark/mllib/linalg.py", line 206, in init ar = np.array(ar, dtype=np.float64) File "/home/skander/spark-1.4.1-bin-hadoop2.6/python/pyspark/mllib/linalg.py", line 676, in getitem row_ind = inds[insert_index] IndexError: index out of bounds

注意:虽然错误发生在同一个函数中(代码在https://spark.apache.org/docs/latest/api/python/_modules/pyspark/mllib/linalg.html),但此错误消息与前一个不同

  • RedHat:相同的命令会导致分段错误,从而导致Spark崩溃。

Tags: ofinpy错误nplineoutspark
1条回答
网友
1楼 · 发布于 2024-04-20 02:23:15

火花2.0.2+

您应该能够迭代SparseVectors。见:SPARK-17587

火花<;2.0.2

好吧,第一种情况非常有趣,但总体行为看起来根本不像一个bug。如果您查看DenseVector构造函数,它只考虑两种情况。

  1. ar是一个^{}对象(0<;=x<;256范围内的不可变整数序列)
  2. 否则我们只需调用np.array(ar, dtype=np.float64)

SparseVector显然不是一个bytes对象,因此当将其传递给构造函数时,它将使用一个用于np.array调用的object参数。如果你检查^{} docs,你会发现object应该

An array, any object exposing the array interface, an object whose __array__ method returns an array, or any (nested) sequence.

您可以检查SparseVector是否不符合上述条件。它不是Pythonsequence type并且:

>>> sv = SparseVector(5, {4: 1.})
>>> isinstance(sv, np.ndarray)
False
>>> hasattr(sv, "__array_interface__")
False
>>> hasattr(sv, "__array__")
False
>>> hasattr(sv, "__iter__")
False

如果要将SparseVector转换为DenseVector,可能应该使用toArray方法:

DenseVector(sv.toArray())

编辑

我认为这种行为解释了DenseVector(SparseVector(...))在某些情况下可能起作用的原因:

>>> [x for x in SparseVector(5, {0: 1.})]
[1.0]
>>> [x for x in SparseVector(5, {4: 1.})]
Traceback (most recent call last):
...
ValueError: Index 5 out of bounds.

相关问题 更多 >