数値の配列(リスト)を要素ごとに加算/減算/乗算/除算するには(ベクトル演算)
Scala 2014/12/31
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 2014/01/09
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言語 2013/11/20
単純に +
, -
を使えばベクトル同士の加算・減算が簡単にできる。
A <- c(1, 2, 3)
B <- c(10, 20, 30)
A + B
# => 11 22 33