らふのプログラミングメモ

プログラミングメモです。

NumPyのndarray その1

今までデータの格納については、
PandasのSeriesやDataFrameのまとめをやりましたが、
NumPyというもあるので、こちらもまとめていきたいと思います。

Numpyってなに?

  • n次元配列のオブジェクトndarrayがある。
  • 高速計算が可能
  • 配列ベースで計算が可能
  • データ分析に適している

らしいです。

下準備

今回はNumPyを使います。
NumPyは標準モジュールではないので、インストールが必要です。

コマンドプロンプトでインストールする場合

pip install numpy

ndarrayで1次元配列〜3次元配列まで実際に作ってみよう

  • 1次元配列を作ってみよう
# NumPyをインポートします。
import numpy as np

data = [1,2,3,4,5]

a = np.array(data)

print(a)

結果:
[1 2 3 4 5]

1次元配列が出来上がりました。

  • 2次元配列を作ってみよう
# NumPyをインポートします。
import numpy as np

data2 = [[1,2,3,4,5],[2,4,6,8,10]]

a2 = np.array(data2)

print(a2)

結果:
[[ 1 2 3 4 5]
[ 2 4 6 8 10]]

2次元配列の出来上がり。

  • 3次元配列に文字列をいれてみよう。
# NumPyをインポートします。
import numpy as np

data3 = [[[1,2,3,4,5],[2,4,6,8,10]],[[3,6,9,12,15],[4,8,12,16,20]]]

a3 = np.array(data3)

print(a3)

結果:
[[[ 1 2 3 4 5]
[ 2 4 6 8 10]]

[[ 3 6 9 12 15]
[ 4 8 12 16 20]]]

3次元配列も出来上がり!

このように何次元配列でも簡単に作れてしまいます。

<最終更新日:2021/09/06>
2021/09/06 投稿

ジェネレータ式を使ってみよう

内包表記にそっくりな表記方法で ジェネレータ式というのがあります。

今日はそれについてのまとめをしていきたいと思います。

 どれくらい似てるの?

例題: y = 2x + 10 (0≦x≦10) を求めてみよう

  • For文で作ってみよう
y = []
for x in range(10):
    y.append(2 * x + 10)
print(y)
  • 内包表記で書いてみよう
z = []
z = [2*x+10 for x in range(10)]
print(z)
  • ジェネレータ式で書いてみよう
w = []
w = (2*x+10 for x in range(10))
print(list(w))

違いは見つかりましたか? 内包表記は括弧が[ ]ですが、ジェネレータ式は( )です。

内包表記とジェネレータ式って何が違うの?

  • 内包表記 最初にすべての整数を実機に生成しようとするため、処理時間がかかるそうです。

  • ジェネレータ式 要求に応じてその都度整数を1つずつ生成するため、処理時間がかかりにくいそうです。

実際に負荷をかけたプログラムを実行して、時間を測ってみよう。

昨日まとめた時間を計測する方法を使ってみよう。

rafu.hatenablog.jp

負荷をかけたいので、xの範囲を0以上1億以下に変更します。

  • For文
import time
y = []
y_b = time.perf_counter()
for x in range(100000000):
    y.append(2 * x + 10)
y_a = time.perf_counter()
y_t = y_a - y_b
print(y_t)

結果:14.576659613999936 s

  • 内包表記
import time
z = []
z_b = time.perf_counter()
z = [2*x+10 for x in range(100000000)]
z_a = time.perf_counter()
z_t = z_a - z_b
print(z_t)

結果:8.063755885000091 s

  • ジェネレータ式
import time
w = []
w_b = time.perf_counter()
w = (2*x+10 for x in range(100000000))
w_a = time.perf_counter()
w_t = w_a - w_b
print(w_t)

結果:6.813899994995154e-05 s

1億回appendをさせてみたところ、結果は以下のとおり

処理方法 かかった時間(秒)
For 14.6
内包表記 8.1
ジェネレータ式 0.000068

このように、ジェネレータ式を使うと処理が早くなるのがわかります。

<最終更新日:2021/09/02>
2021/09/02 投稿