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

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

NumPyのndarray その3 型を混ぜたらどうなる?

昨日は全ての値を整数で計算をやってみました。

rafu.hatenablog.jp

ここで少し気になったこと

ndarray は一括で計算ができたり高速計算が可能でした。

ここで疑問が2つ。
- ndarrayにデータ型を混ぜた状態でデータを入れたらどうなる?
- 文字列(数字)を入れて計算を行ったらどうなる?

ということでやってみたいと思います。

ndarrayにデータ型を混ぜたデータを入れてみよう

2次元データのイメージ

文字列 整数 整数 整数
"a" 1 2 3
"b" 2 4 6

これで実際にやってみます。

同じ2次元データを作成。
import numpy as np

# 2次元データを作ろう。
data = [["a",1,2,3],["b",2,4,6]]
a = np.array(data)
print(a)
#aの型を出力させます
print(a.dtype)

結果: a = [['a' '1' '2' '3'] ['b' '2' '4' '6']]
a.dtype = <U1

結果のイメージ図

文字列 文字列 文字列 文字列
"a" "1" "2" "3"
"b" "2" "4" "6"

数値であった整数値が全て文字列(unicode)に変わってしまいました。

ndarrayに文字列(数値)を入れて計算してみよう。

以下のような文字列(数値)をndarrayに入れてみましょう。

文字列 文字列 文字列
"1" "2" "3"
"2" "4" "6"
同じ2次元データを作成。
import numpy as np

# 2次元データを作ろう。
data2 = [["1","2","3"],["2","4","6"]]
a2 = np.array(data2)
print(a2)
#a2の型を出力させます
print(a2.dtype)

結果:
a2 = [['1' '2' '3'] ['2' '4' '6']]
a2.dtype = <U1

a2のイメージ図

文字列 文字列 文字列
"1" "2" "3"
"2" "4" "6"

これを計算してみよう。

print(a2 + a2)

結果:
以下のようなエラーが出ました。
ufunc 'add' did not contain a loop with signature matching types (dtype('<U1'), dtype('<U1')) -> dtype('<U1')

これより、文字列同士では演算できないようです。

それでも文字列の数値同士を計算したい!

どうしても文字列(数字)から数値に変換して計算させたい!!
そのような時もあると思います。
その場合、数値型に変換して計算させるという方法があります。
今回は中身のデータが全て整数のためint型 に変換させて計算をしてみます。

同じ2次元データを作成。
import numpy as np

# 2次元データを作ろう。
data2 = [["1","2","3"],["2","4","6"]]
a2 = np.array(data2)
print(a2)
#a2の型を出力させます
print(a2.dtype)

#ここから追加。
#a2をint型に変換してF_a2に代入する
F_a2 = a2.astype(int)
print(F_a2)
#F_a2の型を出力させます
print(F_a2.dtype)
print(F_a2 + F_a2)

結果:
a2 = [['1' '2' '3'] ['2' '4' '6']]
a2.dtype = U1

a2のイメージ図

文字列 文字列 文字列
"1" "2" "3"
"2" "4" "6"

F_a2 = [[1 2 3] [2 4 6]]
F_a2.dtype = int64

F_a2のイメージ図

int64 int64 int64
1 2 3
2 4 6

F_a2 + F_a2 = [[ 2 4 6] [ 4 8 12]]

F_a2 + F_a2 のイメージ図

int64 int64 int64
2 4 6
4 8 12

無事、計算ができました!

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

NumPyのndarray その2 計算してみよう

昨日はndarrayで、1次元配列〜3次元配列まで実際に作ってみました。

rafu.hatenablog.jp

Numpyの特徴として、高速計算が可能であったり、
配列ベースでの計算が可能だったりしますが、
どのように行うのか実際にやってみたいと思います。

実際に3次元配列に数値を入れて計算をしてみよう。

まずは昨日と同じデータを入れた3次元配列を作ってみます。

#昨日と同じ3次元データを作成。
import numpy as np

# 3次元データを作ろう。
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+5)
print(a3-3)
print(a3*a3)
print(a3/2)

結果: a3+5
[[[ 6 7 8 9 10]
[ 7 9 11 13 15]]

[[ 8 11 14 17 20]
[ 9 13 17 21 25]]]

a3-3
[[[-2 -1 0 1 2]
[-1 1 3 5 7]]

[[ 0 3 6 9 12]
[ 1 5 9 13 17]]]

a3*a3
[[[ 1 4 9 16 25]
[ 4 16 36 64 100]]

[[ 9 36 81 144 225]
[ 16 64 144 256 400]]]

a3/2
[[[ 0.5 1. 1.5 2. 2.5]
[ 1. 2. 3. 4. 5. ]]

[[ 1.5 3. 4.5 6. 7.5]
[ 2. 4. 6. 8. 10. ]]]

このように、For文などループ処理を使って要素ごとに計算する必要はなく、
ベクトル演算という方法を使って計算を行うことができます。

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