NumPyのndarray その3 型を混ぜたらどうなる?
昨日は全ての値を整数で計算をやってみました。
ここで少し気になったこと
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次元配列まで実際に作ってみました。
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 投稿