NumPy:【組み込み関数】便利そうなもの


サマリ

  • np.clip
    • ある範囲に収める
  • np.frombuffer
    • 型変換
    • バイナリデータ利用
  • np.unique
    • 重複排除(ユニーク
  • np.nonzero
    • Trueまたは0を判定
    • 配列番号返す

前提

サンプルコード

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文字)
  • 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


Posted by futa