NumPy:【組み込み関数】便利そうなもの
目次
サマリ
- np.clip
- ある範囲に収める
- np.frombuffer
- 型変換
- バイナリデータ利用
- np.unique
- 重複排除(ユニーク)
- np.nonzero
- Trueまたは0を判定
- 配列番号返す
前提
- np.astype
- np.random.randint
サンプルコード
np.clip(ある範囲に収める)
import numpy as np
a = np.random.randint(0, 10, 20)
b = np.clip(a, 2, 7)
print(a)
print(b)
[5 0 8 4 7 4 2 7 1 2 2 5 4 2 3 3 3 3 8 9] [5 2 7 4 7 4 2 7 2 2 2 5 4 2 3 3 3 3 7 7]
- 2より小さいものは2に
- 7より大きいものは7に
- 結果、引数にしていした2と7の間に収まった配列になる
np.frombuffer(バイナリデータを型変換)
確認のためバイナリデータを無理やり作成
import numpy as np
a = b'\x01\x02\x03\x04\x05' #数値
b = b'hello world' #文字列
print(a)
print(type(a))
print(b)
print(type(b))
b'\x01\x02\x03\x04\x05' <class 'bytes'> b'hello world' <class 'bytes'>
- 文字列の先頭に「b」を付けている
- typeは「bytes」
バイナリデータを変換(数値)
c = np.frombuffer(a, dtype=np.uint8)
print(c)
print(type(c))
print(type(c[0]))
[1 2 3 4 5] <class 'numpy.ndarray'> <class 'numpy.uint8'>
- dtype=np.uint8
- 16進数を10進数に変換(こちらは変換)
- 最初の1行で、
- バイナリ数値データをndarray(NumPy配列)に格納
- 数値型に変換
バイナリデータを変換(文字列)
import numpy as np
d = np.frombuffer(b, dtype='S1', count=5, offset=6)
print(d)
print(type(d))
print(type(d[0]))
e = d.astype(str)
print(e)
print(type(e))
print(type(e[0]))
[b'w' b'o' b'r' b'l' b'd'] <class 'numpy.ndarray'=""> <class 'numpy.bytes_'=""> ['w' 'o' 'r' 'l' 'd'] <class 'numpy.ndarray'=""> <class 'numpy.str_'="">
- 文字列のバイナリデータの場合は2ステップ
- 1つ目の変換(frombuffer)
- dtype=’S1′
- 型変換はしない
- バイナリデータを1つずつndarray(NumPy配列)として格納する
- count=5, offset=6
- 取得する位置6から(0始まり)
- 取得する数は5(worldの5文字)
- dtype=’S1′
- 2つ目の変換(astype)
- ndarrayの変換を使って、文字列に変換
言葉で説明
- (形式)
- numpy.frombuffer(buffer, dtype=float, count=-1, offset=0)
- buffer
- バッファとして読み込むオブジェクトを指定
- dtype(省略可能)
- 初期値float
- 配列を返すときの要素のデータ型を指定
- count(省略可能)
- 初期値-1(全てのデータを読み込み)
- いくつのアイテムを読み込むかを指定
- offset(省略可能)
- 初期値0
- バイト単位で、どこの地点からデータを読み込むかを指定
- (戻り値)
- 渡されたバッファを変換した配列
np.unique(重複排除)
import numpy as np
a = np.random.randint(20, 30, (2,10))
b = np.unique(a)
print(a)
print(a.shape)
print(b)
[[22 26 22 21 27 27 20 22 28 27] [24 29 21 21 24 27 27 25 20 21]] (2, 10) [20 21 22 24 25 26 27 28 29]
- 20台の数値をランダム抽出で(2,10)個
- 23はなかったみたいです
np.nonzero(0以外の列番号)
import numpy as np
a = np.array([-2,-0.5,0,0.1,2])
b = np.nonzero(a)
c = np.nonzero(a>0)
print(a)
print(b)
print(c)
[-2. -0.5 0. 0.1 2. ] (array([0, 1, 3, 4]),) (array([3, 4]),)
- 1つ目
- 0でない列番号0, 1, 3, 4
- 2つ目
- 0以上の列番号3, 4
