数値の配列(リスト)を要素ごとに加算/減算/乗算/除算するには(ベクトル演算)

Scala

zipしてから要素ごとに演算する方法

val x = List(1, 2, 3)
val y = List(10, 20, 30)

val result = (x zip y).map { case (x, y) => x + y };
print(result);
# => List(11, 22, 33)

インデックスで要素を参照しながら演算する方法

val x = Vector(1, 2, 3)
val y = Vector(10, 20, 30)

val result = (0 until x.size).map(i => x(i) + y(i));
println(result);
// => Vector(11, 22, 33)

以下のコードで速度を比較してみたら後者の方法の方が速かった。

def benchmark(times: Int)(f: => Any): Double = {
  (0 until times).map { _ =>
    val start = System.currentTimeMillis();
    f;
    val end = System.currentTimeMillis();
    end - start;
  }.sum.toDouble / times;
}

def doBenchmark(times1: Int, times2: Int)(f: => Any) {
  benchmark(times1)(f);
  val result = benchmark(times2)(f);
  println(result + "ミリ秒");
}

// 10万個の要素
val x = IndexedSeq.fill(100000)(Math.random());
val y = IndexedSeq.fill(100000)(Math.random());

// zipしてから要素ごとに演算する方法
doBenchmark(10, 1000) {
  val result = (x zip y).map { case (x, y) => x * y };
}
// 10万個の要素の乗算で10ミリ秒ぐらい

// インデックスで要素を参照しながら演算する方法
doBenchmark(10, 1000) {
  val result = (0 until x.size).map(i => x(i) * y(i));
}
// 10万個の要素の乗算で6ミリ秒ぐらい

Python

NumPyを使えば + 演算子、- 演算子、* 演算子、/ 演算子でベクトル同士の加算・減算・乗算・除算が簡単にできる。

import numpy as np

x = np.array([1, 2, 3])
y = np.array([10, 20, 30])
z = np.array([3., 4., 5.])

print x + y
# => [11 22 33]

print x - y
# => [ -9 -18 -27]

print x * y
# => [10 40 90]

print x / z
# => [ 0.33333333  0.5         0.6       ]

print x / y
# => [0 0 0]
# 整数で除算すると答えも整数になる

R言語

単純に +, - を使えばベクトル同士の加算・減算が簡単にできる。

A <- c(1, 2, 3)
B <- c(10, 20, 30)
A + B
# => 11 22 33
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。