4-4.Numpyの関数を知ろう
Numpyの関数を使いこなすのに大事なことは関数の存在を知ることです.コラム:車輪の再発明にあったように自分がこれからしようとしている計算過程は必ず他の先人も試そうとしていて,誰かがNumpyでできるように関数化しているのではないかと考えましょう.Numpyの関数が準備されていればこれからコードを書く必要もありませんし,関数名から動作を推察できますので可読性もupします.ここでは,Numpyの関数のみならずNumpyと相性の良い標準装備関数の組み合わせやNumpyの型変換なども説明します.
(1) これまで使用した関数
np.where(condition[, x, y])
条件conditionがTrueならxをFalseならyを適用します.xとyを指定しない場合,条件を満たす配列の要素番号を返します.
条件conditionがTrueならxをFalseならyを適用します.xとyを指定しない場合,条件を満たす配列の要素番号を返します.
>>> a = np.array ([1,2,3,4,5]) >>> np.where(a >=3) (array([2,3,4]),dtype=int32)
>>> b = np.where(a >=3) >>> b[0] [2,3,4]
>>> a = np.array ([1,2,3,4,5]) >>> np.where(a >=3) (array([2,3,4]),dtype=int32) >>> b = np.where(a >=3) >>> b[0] [2,3,4]
>>> a = np.random.randint(0,10,(5,3)) [[6 6 1] [3 3 7] [1 3 9] [8 2 9] [6 7 5]] >>> np.where(a == 9) (array([2, 3], dtype=int32), array([2, 2], dtype=int32))
>>> a = np.random.randint(0,10,(5,3)) >>> b,c = np.where(a == 9) #切り出し >>> print(b,c) [2 3] [2 2] >>> for i,j in zip(b,c): >>> :print(i,j)
2,2 #二行二列目 3,2 #三行二列目
ndarrayの各要素(数値)に対して条件分岐を適用した場合に多用します.組み込み関数であるzip()との相性が非常に良いです.多次元配列の場合は行データと列データが別々のarrayで出てくるので注意が必要です.
np.full(shape, (fill_value))
指定した fill_valueで満たされた大きさがshapeの配列を生成します.
指定した fill_valueで満たされた大きさがshapeの配列を生成します.
np.empty(shape)
ランダムな値で満たされた大きさがshapeの配列を生成します.多次元の場合はshapeを(x,y,z…)と書きます.
ランダムな値で満たされた大きさがshapeの配列を生成します.多次元の場合はshapeを(x,y,z…)と書きます.
np.darray.dtype
指定したnp.darrayの型を返します.なお,darrayのdは次元数(Dimension)を表します.
指定したnp.darrayの型を返します.なお,darrayのdは次元数(Dimension)を表します.
np.zeros(shape , dtype = float…)
0で初期化された大きさshapeのndarrayを生成します.ndarrayの型dtypeのデフォルトは浮動小数点float64です.dtype = int8とした場合は最大八桁が格納できる整数型になります.
0で初期化された大きさshapeのndarrayを生成します.ndarrayの型dtypeのデフォルトは浮動小数点float64です.dtype = int8とした場合は最大八桁が格納できる整数型になります.
np.ones(shape , dtype = float…)
1で初期化された大きさshapeのndarrayを生成します.
1で初期化された大きさshapeのndarrayを生成します.
np.savetxt(fname,X,delimiter...)
delimiterで区切られた対象の配列Xを fnameとして保存します.
delimiterで区切られた対象の配列Xを fnameとして保存します.
np.loadtxt(fname...)
指定したcsvファイルからデータをndarrayに格納します.
指定したcsvファイルからデータをndarrayに格納します.
(2) 数学系
np.log(X…)
指定したndarrayであるXの対数を返します.np.log10やnp.log2などの親戚も.
指定したndarrayであるXの対数を返します.np.log10やnp.log2などの親戚も.
np.power(X,Y…)
指定したndarrayであるXのY乗を返します.
指定したndarrayであるXのY乗を返します.
>>> a = range(0,5) >>> np.power(a,2) #broadcasting [0,1,4,9,16]
>>> b = range(0,5) >>> np.power(a,b) [1,1,4,27,256]
np.exp(X,…)
指定したndarrayである X について自然対数eを基底にした指数を返します.
指定したndarrayである X について自然対数eを基底にした指数を返します.
np.reciprocal(X,…)
指定したndarrayであるXについて逆数を返します.
Xがint型の場合は正常に機能しないため,予め Xの型をfloatに変更する必要があります.
指定したndarrayであるXについて逆数を返します.
Xがint型の場合は正常に機能しないため,予め Xの型をfloatに変更する必要があります.
(3) 四捨五入系
np.floor(X…)
指定したndarrayであるXの小数点以下を切り捨て,値の小さい方の整数にします.これは数学の床関数に相当します.
指定したndarrayであるXの小数点以下を切り捨て,値の小さい方の整数にします.これは数学の床関数に相当します.
np.trunc(X…)
指定したndarrayであるXの小数点以下を切り捨てます.
指定したndarrayであるXの小数点以下を切り捨てます.
np.ceil(X…)
指定したndarrayであるXの小数点以下を切り捨て,値の大きい方の整数にします.これは数学の天井関数に相当します.
指定したndarrayであるXの小数点以下を切り捨て,値の大きい方の整数にします.これは数学の天井関数に相当します.
np.round(X, decimal = 0…)
指定したndarrayであるXを四捨五入します.
decimalを指定することで四捨五入する桁数を決めることが出来ます.
指定したndarrayであるXを四捨五入します.
decimalを指定することで四捨五入する桁数を決めることが出来ます.
np.fix(X…)
指定したndarrayであるXについて,0に近い方向の整数をとります.
指定したndarrayであるXについて,0に近い方向の整数をとります.
np.abs(X…) or np.absolute(X…)
指定したndarrayであるXの絶対値を返します.
指定したndarrayであるXの絶対値を返します.
(4) 新規生成系
np.copy(X…)
指定したndarrayであるXについて,深いコピーを生成します.
指定したndarrayであるXについて,深いコピーを生成します.
X.view( dtype = None…)
指定したndarrayであるXについて,浅いコピーを生成します.
指定したndarrayであるXについて,浅いコピーを生成します.
>>> a = np.array(range(0,5)) >>> b = np.copy(a) >>> b [0 1 2 3 4] >>> b[2] = 10 >>> b [0 1 10 3 4] >>> a [0 1 2 3 4]
>>> a = np.array(range(0,5)) >>> b = a.view() >>> print(b) [0 1 2 3 4] >>> b[2] = 10 >>> b [0 1 &bold(){10} 3 4] >>> a [0 1 10 3 4]
copyは新たにメモリースペースを確保して配列をコピーします..viewは配列名は違えど,参照しているメモリ領域は同期されているいわばショートカットです.従って,viewで複製した新規配列の内容を変えると,コピー元の内容も変更されます.しかし,新規にメモリースペースを確保する必要がないのでメモリ効率の改善に役立ちます.A = Bという記法は浅いコピーなので注意しましょう.
>>> np.linspace(2.0, 3.0, num=5) array([ 2. , 2.25, 2.5 , 2.75, 3. ]) >>> np.linspace(2.0, 3.0, num=5, endpoint=False) array([ 2. , 2.2, 2.4, 2.6, 2.8]) >>> np.linspace(2.0, 3.0, num=5, retstep=True) (array([ 2. , 2.25, 2.5 , 2.75, 3. ]), 0.25)
np.arange([start, ]stop[,step][,dtype = None])
標準関数であるrange()のnumpy版.[start,end)の範囲で連番の整数を生成します.公差stepの等差数列も作成できます.
標準関数であるrange()のnumpy版.[start,end)の範囲で連番の整数を生成します.公差stepの等差数列も作成できます.
np.linspace(start, stop, [num = 50,] [endpoint = True,] [retstep = False,] [dtype = None])
startからendの範囲でnum等分されたndarrayを返します.
numは生成する配列の要素数を示しています.デフォルトは50です.
endpointはstopを要素に含めるかどうかを指定します.デフォルトはTrue=含めるです.
retstepは公差を表示するかどうかを指定します.デフォルトはFalse=表示しないです.
startからendの範囲でnum等分されたndarrayを返します.
numは生成する配列の要素数を示しています.デフォルトは50です.
endpointはstopを要素に含めるかどうかを指定します.デフォルトはTrue=含めるです.
retstepは公差を表示するかどうかを指定します.デフォルトはFalse=表示しないです.
>>> a = np.array([[0,10,5,9,0],[0,12,0,6,8]]) #2行5列 >>> a.max() 12 >>> a.max(axis=0) #行方向(縦)の最大値 0,12,5,9,8 >>> a.max(axis=1) #列方向(横)の最大値 10,12
(5) 参照系
np. max(X[,axis = None]…) or X.max()
ndarrayであるXの最大値を返します.X.max()という簡易記法も可能.
axis =以後に軸に対応した数値を入れることで軸方向の最大値を出力します(0=行,1=列).
ndarrayであるXの最大値を返します.X.max()という簡易記法も可能.
axis =以後に軸に対応した数値を入れることで軸方向の最大値を出力します(0=行,1=列).
np.min(X[,axis = None]…) or X.min()
ndarrayであるXの最小値を返します.X.min()という簡易記法も可能.
ndarrayであるXの最小値を返します.X.min()という簡易記法も可能.
np.sum(X[,axis = None]…) or X.sum()
ndarrayであるXの合計値を返します.X.sum()という簡易記法も可能.
ndarrayであるXの合計値を返します.X.sum()という簡易記法も可能.
np.argmax(X[,axis = None]…) or X.argmax()
ndarrayであるXの最大値の要素番号を一次元ベースで返します.
数学でも arg maxという記述方法があります.
ndarrayであるXの最大値の要素番号を一次元ベースで返します.
数学でも arg maxという記述方法があります.
>>> a = np.array([[0,10,5,9,0],[0,12,0,6,8]]) #2行5列 >>> argmax(a) 6 #行列番号ではなく,flattenされた1d-arrayとしての番号が返される.
>>> a = np.array([0,1,20,0,6,20]) >>> argmax(a) 2 #最大値が複数ある場合は最初の出現が優先される
>>> argmax(a,axis = 0) 0,1,0,0,1 >>> argmax(a,axis = 1) 1,1
np.unravel_index(indices,dim…)
一次元ベースで数えた場合の要素番号(indices)を形状dimの多次元形式で見た場合の要素番号を多次元形式で返します.
一次元ベースで数えた場合の要素番号(indices)を形状dimの多次元形式で見た場合の要素番号を多次元形式で返します.
>>> a = np.array([[0,10,5,9,0],[0,12,0,6,8]]) #2行5列 >>> index = np.argmax(a) #No.6 >>> dimension = a.shape #行列数の取得 >>> print(dimension) (2,5) >>> np.unravel_index(index,dimension) (1,1) #一行一列目に最大値(12)がある
np.argmin(X[,axis = None]…) or X.argmin()
ndarrayであるXの最小値の要素番号を一次元ベースで返します.
ndarrayであるXの最小値の要素番号を一次元ベースで返します.
np.nonzero(X)
非ゼロ要素のあるインデックスを軸ごとに1次元配列にして返します.
非ゼロ要素のあるインデックスを軸ごとに1次元配列にして返します.
>>> a = np.array([[0,10,5,9,0],[0,12,0,6,8]]) #2行5列 >>> np.nonzero(a) (array([0, 0, 0, 1, 1, 1], dtype=int32), array([1, 2, 3, 1, 3, 4], dtype=int32)) >>> b,c = np.nonzero(a) #各軸ごとの要素を別々に取得 >>> print(b,c) [0 0 0 1 1 1] [1 2 3 1 3 4] >>> print(list(zip(b,c)) [(0, 1), (0, 2), (0, 3), (1, 1), (1, 3), (1, 4)] #非ゼロ要素の要素番号がzipによって行列形式にまとまった.
(6) 整理整頓系
np.c_[X1[,X2]…]
Xを縦ベクトルに変換します(1d-arrayの場合).ndarrayが複数の場合は末尾に随時結合します.
Xを縦ベクトルに変換します(1d-arrayの場合).ndarrayが複数の場合は末尾に随時結合します.
>>> a = np.array([1,2,3]) a [1 2 3] >>> np.c_[a] ([[1],
[2], [3]])
>>> print(np.c_[a].shape) (3,1)
>>> a = np.array([1,2,3]) >>> b = np.array([4,5,6]) >>> print(a,b) [1 2 3] [4 5 6] >>> np.c_[a,b] ([[1, 4],
[2, 5], [3, 6]])
>>> print(np.c_[a].shape) (3,2)
np.vstack(X1[,X2]…)
複数のndarrayを垂直(vertical)方向に結合します
複数のndarrayを垂直(vertical)方向に結合します
np.hstack(X1[,X2]…)
複数のndarrayを水平(horizontal)方向に結合します
複数のndarrayを水平(horizontal)方向に結合します
X.reshape or np.reshape(X,newshape)
複数のndarrayをnewshapeに沿って変形します
複数のndarrayをnewshapeに沿って変形します
X.flatten
多次元配列Xを一次元に変換します
多次元配列Xを一次元に変換します
np.clip(X, min,max…)
Xの要素xをmin≤x≤maxの範囲に収めます
Xの要素xをmin≤x≤maxの範囲に収めます
>>> a = np.arange(10) >>> np.clip(a, 1, 8) array([1, 1, 2, 3, 4, 5, 6, 7, 8, 8])
>>> a = np.array([[1,2,3],[4,5,6],[7,8,9]]) >>> b = np.array([[10,20,30],[40,50,60],[70,80,90]]) >>> np.vstack((a,b)) array([[ 1, 2, 3],
[ 4, 5, 6], [ 7, 8, 9], [10, 20, 30], [40, 50, 60], [70, 80, 90]])
>>> np.vstack((a,b)).flatten array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90])
>>> np.hstack((a,b)) array([[ 1, 2, 3, 10, 20, 30],
[ 4, 5, 6, 40, 50, 60], [ 7, 8, 9, 70, 80, 90]])
>>> np.hstack((a,b)).reshape(6,3) array([[ 1, 2, 3],
[ 4, 5, 6], [ 7, 8, 9], [10, 20, 30], [40, 50, 60], [70, 80, 90]])
np.sort(X, axis = None…)
Xの要素を小さい順に並び替えます.
後に説明するスライスと合わせることでTop10やWorst5が選択できます.
Xの要素を小さい順に並び替えます.
後に説明するスライスと合わせることでTop10やWorst5が選択できます.
np.argsort(X, axis = None…)
Xの要素のを小さい順に並び替えた場合の要素番号を取得します.
Xの要素のを小さい順に並び替えた場合の要素番号を取得します.
>>> a = np.arange(10,0,-1) >>> print(a) [10 9 8 7 6 5 4 3 2 1] >>>np.sort(a) [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> np.argsort(a) [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> b = np.arange(0,10,1) >>> c = np.vstack((a,b)) c [[10 9 8 7 6 5 4 3 2 1]
[ 0 1 2 3 4 5 6 7 8 9]]
>>> np.sort(c,axis = 0) #行方向 [[ 0, 1, 2, 3, 4, 5, 4, 3, 2, 1],
[10, 9, 8, 7, 6, 5, 6, 7, 8, 9]]
>>> np.sort(c,axis = 1) #列方向 [[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
(7) 乱数系(np.random.)
このライブラリはnp.関数名だけではなく,np.random.関数名とrandomクラスへのアクセスが必要となります.あるいは,from numpy import randomによりnumpyのrandomクラスのみの使用を指定することでnp.を省略したrandom.関数名という表記が出来ます.
このライブラリはnp.関数名だけではなく,np.random.関数名とrandomクラスへのアクセスが必要となります.あるいは,from numpy import randomによりnumpyのrandomクラスのみの使用を指定することでnp.を省略したrandom.関数名という表記が出来ます.
np.random.rand(shape)
指定したshapeに沿って[0,1)の範囲で乱数を生成します.
指定したshapeに沿って[0,1)の範囲で乱数を生成します.
{np.random.randint(low, high=None[, size=None]…)
}指定したsizeに沿って[low,high)の範囲で整数の乱数を生成します.
}指定したsizeに沿って[low,high)の範囲で整数の乱数を生成します.
>>> np.random.randint(0,5,10) [4, 2, 0, 0, 1, 2, 1, 1, 3, 1] #0≤x<5の範囲で生成している[0,5) >>> [random.randint(0,5) for i in range(10)] #リスト内包表記,リストの中にfor文 [0, 5, 3, 5, 4, 3, 2, 4, 5, 5] #0≤x≤5の範囲で生成している[0,5] #同じrandintでもnumpyと標準装備関数では生成範囲が違うので注意しよう
np.random.randint(low, high=None[, size=None]…)
指定したsizeに沿って[low,high)の範囲で整数の乱数を生成します.
指定したsizeに沿って[low,high)の範囲で整数の乱数を生成します.
np.random.randn([size = None]…)
指定したsizeの乱数を標準正規分布N(0,1)に沿って生成します.
指定したsizeの乱数を標準正規分布N(0,1)に沿って生成します.
{np.random.normal(loc=0.0, scale=1.0[, size=None])
}指定したsizeの乱数を正規分布N(loc,scale)に沿って生成します.
}指定したsizeの乱数を正規分布N(loc,scale)に沿って生成します.
np.random.seed(a = None [,integer])
aが省略された場合には現在のシステム時刻を基礎に乱数生成器を初期化します.
整数Integerが使用された場合,Integerに沿った乱数が生成されます.
aが省略された場合には現在のシステム時刻を基礎に乱数生成器を初期化します.
整数Integerが使用された場合,Integerに沿った乱数が生成されます.
numpy.random.choice(a[, size=None][, replace=True][, p=None])
a = 整数:range(0,a)の範囲でランダムに整数を生成します
a = 一次元配列:配列内の要素をランダムに生成.それぞれの生成確率は対応する確率リストpによる指定が可能です.
replaceは重複要素を許容するかどうかを指定します.デフォルトはTrue=許容する.
a = 整数:range(0,a)の範囲でランダムに整数を生成します
a = 一次元配列:配列内の要素をランダムに生成.それぞれの生成確率は対応する確率リストpによる指定が可能です.
replaceは重複要素を許容するかどうかを指定します.デフォルトはTrue=許容する.
>>> from numpy import random >>> random.choice(5,5) [0, 0, 2, 1, 3] >>> a = [0,5,10,15,20] >>> random.choice(a, 10) [20, 5, 5, 5, 15, 10, 0, 10, 10, 15] >>> a = [“a”,”b”,”c”,”d”,”e”] >>> random.choice(a, 10) array(['c', 'a', 'b', 'c', 'c', 'a', 'a', 'b', 'b', 'c'], dtype='<U1')
>>> a = [0,5,10,15,20] >>> p = [0.2, 0.5, 0.1, 0.1, 0.1] >>> random.choice(a, 10, p=p) [ 0, 20, 5, 5, 20, 5, 0, 0, 5, 5]
np.random.poisson (lam=1.0, size=None)
ポアソン分布に沿って自然数を発生させます.
lamは平均であり,lamdaの略です.ポアソン分布の定式化では,平均をλとする慣習があります.
sizeは発生させる乱数の大きさを指定します.リスト( )で括れば多次元配列が作れます.
ポアソン分布に沿って自然数を発生させます.
lamは平均であり,lamdaの略です.ポアソン分布の定式化では,平均をλとする慣習があります.
sizeは発生させる乱数の大きさを指定します.リスト( )で括れば多次元配列が作れます.
>>> From numpy.random import poisson >>> poisson( ) #平均1.0,サイズ1 2 >>> poisson( ) 0 >>> poisson(0.5,10) array([0, 0, 1, 0, 0, 1, 2, 0, 1, 0]) >>> poisson(2,10) array([3, 3, 0, 2, 0, 1, 0, 3, 1, 3])
他にも正規分布や対数正規分布など各種の分布系が用意されています.確率密度や信頼/予想区間はnumpyの発展版であるscipyというライブラリに実装されており,これを使う機会もきっとあることでしょう.
演算系
np.prod(a[, axis=None]…)
指定したndarrayの総積⊓を返します.axisを指定することで特定の軸方向のみの計算が可能.
指定したndarrayの総積⊓を返します.axisを指定することで特定の軸方向のみの計算が可能.
np.cumsum(a[, axis=None]…)
指定したndarrayの累積和a_0,a_0+a_1,a_0+a_1+a_2⋯を返します.
指定したndarrayの累積和a_0,a_0+a_1,a_0+a_1+a_2⋯を返します.
>>> np.cumsum(range(0,5)) [ 0, 1, 3, 6, 10] >>> np.cumsum([range(0,5),range(0,5)]) #二次元配列 [ 0, 1, 3, 6, 10, 10, 11, 13, 16, 20] #一次元ベースで累積される >>> np.cumsum([range(0,5),range(0,5)],axis=0) [[0, 1, 2, 3, 4],
[0, 2, 4, 6, 8]] #行方向(上から下へ累積されている)
np.cumprod(a[, axis=None]…)
指定したndarrayの累積積a_0,a_0×a_1,a_0×a_1×a_2⋯を返します.
指定したndarrayの累積積a_0,a_0×a_1,a_0×a_1×a_2⋯を返します.
(9) 集合系
np.unique(X[, axis=None][,return_index=False][, return_counts=False]…)
指定したndarrayから重複要素を取り除いた集合Aを作成します.return_indexを指定することでユニーク要素の初出要素番号を出力します.デフォルトはFalse=表示しない. return_countsを指定することでユニーク要素の出現回数を出力します.
指定したndarrayから重複要素を取り除いた集合Aを作成します.return_indexを指定することでユニーク要素の初出要素番号を出力します.デフォルトはFalse=表示しない. return_countsを指定することでユニーク要素の出現回数を出力します.
>>> np.unique([1, 1, 2, 2, 3, 3]) array([1, 2, 3]) #重複要素の削除
>>> np.unique(['a', 'b', 'b', 'c', 'a'], return_index=True) (array(['a', 'b', 'c'], dtype='<U1'), array([0, 1, 3], dtype=int32)) #各オリジナル要素の初出要素番号の出力
>>> np.unique(['a', 'b', 'b', 'c', 'a'], return_counts=True) (array(['a', 'b', 'c'], dtype='<U1'), array([2, 2, 1])) #各オリジナル要素の出現回数のカウント
>>> a = np.array([[1, 0, 0], [1, 0, 0], [2, 3, 4]]) >>> np.unique(a, axis=0) array([[1, 0, 0], [2, 3, 4]]) #axisオプションも使える >>> np.unique(['b', 'a', 'b', 'c', 'a']) array(['a', 'b', 'c'], dtype='<U1') #集合系関数は順番を並び替えて[a,b,c]や[1,2,3]のようにソート出力するので注意
np.in1d(X1,X2[,invert=False]…)
1番目の引数X1の配列の各要素が、2番目の引数X2の配列に含まれるかどうかの真偽値(bool型)を返します.invertによって出力されるbool型を逆にできます.
1番目の引数X1の配列の各要素が、2番目の引数X2の配列に含まれるかどうかの真偽値(bool型)を返します.invertによって出力されるbool型を逆にできます.
>>> test = np.array([0, 1, 2, 5, 0]) >>> states = [0, 2] >>> np.in1d(test, states) array([ True, False,True, False,True], dtype=bool) >>> np.in1d(test, states,invert = True) array([False, True, False, True, False]) #FalseとTrueが逆になっている
np.intersect1d(X1,X2…)
1番目の引数X1と2番目の引数X2の共通要素を抜き出したX_1∩X_2を出力します.
高級関数のfunctool.reduceを使えば多次元配列にも適用可能です
1番目の引数X1と2番目の引数X2の共通要素を抜き出したX_1∩X_2を出力します.
高級関数のfunctool.reduceを使えば多次元配列にも適用可能です
>>> np.intersect1d([6,5,4,3], [1,2,3,4]) [3,4] >>> from functools import reduce >>> reduce(np.intersect1d, ([1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2])) array([3]) >>> a = [[1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2]] >>> reduce(np.intersect1d,a) array([3]) #多次元listも対応している
[functools.reduceは一体何をしているのか?]
functools.reduceは関数を引数とする高級関数の一つです.np.intersect1dのように引数X1とX2という2つの引数を使用する関数の繰り返しに効果を発揮します.intersect1dはnp.intersect1d([6,5,4,3], [1,2,3,4])のように使用するため,引数が3つになるとエラーとなります.例えば,[1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2]という3つのリストがあり,それらの共通要素を出力させたいときには以下のように書かなくてはなりません.
functools.reduceは関数を引数とする高級関数の一つです.np.intersect1dのように引数X1とX2という2つの引数を使用する関数の繰り返しに効果を発揮します.intersect1dはnp.intersect1d([6,5,4,3], [1,2,3,4])のように使用するため,引数が3つになるとエラーとなります.例えば,[1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2]という3つのリストがあり,それらの共通要素を出力させたいときには以下のように書かなくてはなりません.
>>> result1 = np.intersect1d([1, 3, 4, 3], [3, 1, 2, 1]) >>> result2 = np.intersect1d(result1, [6, 3, 4, 2]) >>> result2 array([3])
これはやや面倒です.functools.reduceは対象のリストを全て引数にしてこの繰り返しを省略してくれます.ただし,様々なリストを比較する際には引数として入力する変数が reduce(np.intersect1d, ([1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2], [5.6…))のように非常に多くなってしまいます.functools.reduceは多次元リストにも対応が可能であり,リストをaとするとResult1 = 0行目と1行目の比較,Result2 = Result1と2行目の比較…という動作を自動で行ってくれます.こうすれば,多次元配列をaとして,reduce(np.intersect1d,a)という見やすい書き方ができるようになります.
np.setdiff1d(X1,X2[, assume_unique=False]…)
1番目の引数X1から2番目の引数X2と共通する要素を除外した集合を生成します.
assume_uniqueオプションで出力結果のソート有無と重複まとめの有無を選択できます.
1番目の引数X1から2番目の引数X2と共通する要素を除外した集合を生成します.
assume_uniqueオプションで出力結果のソート有無と重複まとめの有無を選択できます.
>>> a = np.array([1, 2, 3, 2, 4, 1]) >>> b = np.array([3, 4, 5, 6]) >>> np.setdiff1d(a, b) array([1, 2])
>>> np.setdiff1d(a, b, assume_unique…) array([1, 2, 2, 1]) #重複部分がまとめられず,元のArrayにおける出現順序を踏襲している
np.setxor1d(X1,X2[, assume_unique=False]…)
1番目の引数X1と2番目の引数X2で共通する要素X_1∩X_2を除外した(X_1∩X_2 ) ̅を生成します.
assume_uniqueオプションで出力結果のソート有無と重複まとめの有無を選択できます.
1番目の引数X1と2番目の引数X2で共通する要素X_1∩X_2を除外した(X_1∩X_2 ) ̅を生成します.
assume_uniqueオプションで出力結果のソート有無と重複まとめの有無を選択できます.
>>> a = np.array([1, 2, 3, 2, 4, 1]) >>> b = np.array([3, 4, 5, 6]) >>> np.setdiff1d(a, b) array([1, 2]) #aにあってbにない要素
>>> a = np.array([1, 2, 3, 2, 4, 1]) >>> b = np.array([3, 4, 5, 6]) >>> np.setor1d(a, b) array([1, 2, 5, 6]) #aあるいは(or)bだけにあるもの
np.union1d(X1,X2)
1番目の引数X1と2番目の引数X2の要素を合わせたものを返します.
1番目の引数X1と2番目の引数X2の要素を合わせたものを返します.