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

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

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