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 投稿