数理コンサルタントの備忘録

あなたの悩みを数理で解決する

Numpy備忘録

仕事ではpandasのデータフレームをよく利用するが、計算速度を向上させるためにはdf.valuesでNumpy配列にして計算させることが多い。 ここでは、numpyの基本的な使い方の備忘録を記録する。(numpy公式ドキュメント)

まずはお決まりのimport

import numpy as np

以下、備忘録

'''np.where(condition[, x, y])'''
a = np.array([0,1,1,1,2])
np.where(a > 1, a*10, a) # a > 1がTrueのときa*10, Falseのときaとなる
# array([ 0,  1,  1,  1, 20])

np.where(a > 1) # 条件のみの場合は該当するindexを返す
# (array([4]),)

'''np.bincount(x, weights=None, minlength=0)'''
a = np.array([0,1,1,1,2])
np.bincount(a,minlength=5) # minlengthで頻度をカウントするindex数を設定する
# array([1, 3, 1, 0, 0])

w = np.array([0.3, 0.5, 0.2, 0.7, 1., -0.6])
x = np.array([0, 1, 1, 2, 2, 2])
np.bincount(x,  weights=w) # weightsにより、同じラベルでもindexにより重みを変えて頻度を集計する
# array([ 0.3,  0.7,  1.1])

axisの考え方

  • 行方向:行を圧縮 。2次元の場合はaxis=0
  • 列方向:列を圧縮 。2次元の場合はaxis=1
data = np.array(
    [
    [1,10,10],
    [1,10,10],
    [2,20,20],
    [2,20,20],
    ]
)
print(data.shape)
print(data.reshape(2,2,3))

data.reshape(2,2,3)では、(データ数、行、列)となっている。
この場合、行方向はaxis=1、列方向はaxis=2となる。

print(data.reshape(2,2,3).sum(axis=1))
#[[ 2 20 20]  
# [ 4 40 40]]

print(data.reshape(2,2,3).sum(axis=2))
#[[21 21]  
# [42 42]]