は、配列内の1の数をカウントする機能を定義します。
def foo(x):
return (x==1).sum()
と2D配列:
を
In [431]: X=np.array([[1,0,2],[3,1,1],[0,2,3]])
行に繰り返し適用できます。
In [432]: [foo(i) for i in X] # iterate on 1st dimension
Out[432]: [1, 2, 0]
In [433]: [foo(X[i,:]) for i in range(3)]
Out[433]: [1, 2, 0]
と(ここではPythonの合計)sum
との合計数を取得
In [434]: sum([foo(X[i,:]) for i in range(3)])
Out[434]: 3
書かれたようfoo
は、配列全体
In [435]: foo(X)
Out[435]: 3
と行数のために適用されると同じことを取得しますnp.sum
軸コントロールを使用してください:
In [440]: np.sum(X==1, axis=1)
Out[440]: array([1, 2, 0])
apply_along_axis
行の繰り返しの同じ種類にすることができます
In [438]: np.apply_along_axis(foo,1,X)
Out[438]: array([1, 2, 0])
が、これのために、それはやり過ぎです。これは、nth
以外のすべてのディメンションに対して反復処理を行うのが難しい3Dまたはそれ以上の配列の方が便利です。独自の繰り返しを行うよりも決して高速ではありません。
配列全体を処理する関数を書くことができるのは明らかです。しかし、行を反復する必要がある場合、魔法の解決策はありません。 vectorize
およびfrompyfunc
ラップ関数は1次元配列ではなくスカラー値で動作します。一部のrow
問題は、行をより大きなdtypeオブジェクト(たとえば、unique
行)にキャストすることで解決されます。
'sum(np.apply_along_axis(someFunc、1、A))'ベクトル化されたオプションではありませんか? – Divakar
'someFunc'とは何でしょうか? – MSeifert
この場合、1行あたりの等しい値の数がカウントされています...しかし、私はかなりの数のインスタンスでこの問題に遭遇しました。 – Faser