#scala #apache-spark
#scala #apache-spark
Вопрос:
У меня есть вектор, и я хочу удалить элементы из вектора. Как я могу это сделать в Scala?Мой ввод — это вектор[2.0, 3.0, 0.3, 1.0, 4.0] —> Vector[Double] и я хочу, чтобы на выходе был вектор [2.0, 0.3, 4.0], поэтому я хочу удалить элемент с индексом 1 и 3 из моего входного вектора…
def removeElementFromVector(input: Vector) = {
val inputAsArray = input.toArray
inputAsArray
// ...
val reducedInputAsVector = inputAsArray.toVector
}
Комментарии:
1. Просто для ясности, когда вы говорите, что хотите удалить элемент, как это конкретно происходит? Можете ли вы привести пример ввода и вывода о том, что вы ищете?
Ответ №1:
Да, вы можете использовать filter для достижения этой цели, но нам нужно добавить индекс, чтобы удалить элемент по индексу:
Пример: ваш вектор (scala.collection.immutable.Вектор [Двойной]):
scala> val v1 = val v1 = Vector(2.2, 3.3, 4.4, 5.5, 6.6, 4.4)
Output: Vector(2.2, 3.3, 4.4, 5.5, 6.6, 4.4)
Теперь мы удалим элемент с индексом 2:
scala> var indexRemove=2
scala> val v2 = v1.zipWithIndex.filter(x => x._2!=indexRemove).map(x=>x._1).toVector
Output: Vector(2.2, 3.3, 5.5, 6.6, 4.4)
Теперь мы удалим элемент с индексом 3
scala> var indexRemove=3
scala> val v2 = v1.zipWithIndex.filter(x => x._2!=indexRemove).map(x=>x._1).toVector
Output: Vector(2.2, 3.3, 4.4, 6.6, 4.4)
Надеюсь, это поможет.
Комментарии:
1. Спасибо, но это не работает, возможно, потому, что я использую » org.apache.spark.mllib.linalg. Вектор »
2. Это не приведет к удалению объекта с индексом 2, оно удалит все объекты, равные объекту с индексом 2. (indexOf даст индекс первой вещи, равный x) Вы могли бы выполнить v1.diff List(v1 (N)), чтобы удалить только один экземплярN-го элемента. Если вы хотите специально удалить N-й элемент, вам нужно выполнить v1.slice(0, N) v1.slice(N 1, v1.size). Или v1.zip (от 0 до v1.размер). filterNot( ._2 == N).map( ._1).
Ответ №2:
Мой ввод: Вектор[2.0, 3.0, 0.3, 1.0, 4.0] —> Vector[Double] и я хочу, чтобы на выходе был вектор [2.0, 3.0, 0.3, 4.0], поэтому я хочу удалить элемент с индексом 1 и 3 из моего входного вектора. Ответ на мой вопрос был недостаточно ясен..
Ответ №3:
Вы можете использовать filter
метод для их удаления.
> val reducedInputVector = input.filter(x => !(Array(1,3) contains input.indexOf(x)))
reducedInputVector: scala.collection.immutable.Vector[Double] = Vector(2.0, 0.3, 4.0)
Комментарии:
1. Этот ответ неверен и не имеет смысла. Не могли бы вы просмотреть его, пожалуйста?
2. @eliasah Теперь я обновил код. Не могли бы вы проверить, все ли в порядке? Я не понял, почему это было неправильно. Это потому, что я был слишком тупым?
Ответ №4:
Я решил это с помощью apply:
val vec1 = Vector(2.0,3.0,0.3,1.0, 4.0)
val vec2 = Vectors.dense(vec1.apply(0), vec1.apply(1),vec1.apply(2), vec1.apply(4))
вывод
vec1: scala.collection.immutable.Vector[Double] = Vector(2.0, 3.0, 0.3, 1.0, 4.0)
vec2: org.apache.spark.mllib.linalg.Vector = [2.0,3.0,0.3,4.0]
Комментарии:
1. Vectors.dense не является частью стандартной библиотеки Scala, vec2 имеет другой тип данных, чем vec1. Кроме того, запись
vec1.apply(0)
излишне подробна, поскольку вы можете просто писатьvec1(0)
.2. В своем вопросе и комментариях вы неоднократно заявляли, что хотите «удалить элемент с индексом 1 и 3», но то, что вы сделали, — это удалить только элемент с индексом 3 очень неэффективным способом. Ваш вопрос и ваше решение не имеют смысла. Если бы у вас
Vector
было 247 элементов, и вы хотели удалить тот, который находится с индексом 9, так ли вы бы это сделали?3. мой ввод представляет собой вектор типа «org.apache.spark.mllib.linalg. Вектор».
Ответ №5:
def deleteItem[A](row: Vector[A], item: Int): Vector[A] = {
val (a,b) = row.splitAt(item)
if (b!=Nil) a b.tail else a
}