42

Numpy を使用してデータを行列に格納しています。R の背景から来て、行列の行/列または両方に関数を適用する非常に簡単な方法がありました。

python/numpy の組み合わせに似たものはありますか? 私自身の小さな実装を書くことは問題ではありませんが、私が思いついたバージョンのほとんどは、既存の実装よりも効率が大幅に低下し、メモリを大量に消費するように思えます。

numpy マトリックスからローカル変数などへのコピーを避けたいのですが、それは可能ですか?

私が実装しようとしている関数は、主に単純な比較です (たとえば、特定の列のいくつの要素が x よりも小さいか、絶対値が y よりも大きい要素がいくつあるか)。

4

4 に答える 4

44

ほとんどすべてのnumpy関数は配列全体で動作するか、特定の軸(行または列)で動作するように指示できます。

numpy配列または配列スライスに作用するnumpy関数の観点から関数を定義できる限り、関数は配列全体、行、または列に対して自動的に動作します。

より具体的なアドバイスを得るために、特定の関数を実装する方法について質問する方が役立つ場合があります。


Numpyはnp.vectorizenp.frompyfuncを提供して、数値を操作するPython関数をnumpy配列を操作する関数に変換します。

例えば、

def myfunc(a,b):
    if (a>b): return a
    else: return b
vecfunc = np.vectorize(myfunc)
result=vecfunc([[1,2,3],[5,6,9]],[7,4,5])
print(result)
# [[7 4 5]
#  [7 6 9]]

(最初の配列の要素は、2番目の配列が大きい場合、2番目の配列の対応する要素に置き換えられます。)

しかし、あまり興奮しないでください。np.vectorizenp.frompyfunc単なる構文糖衣です。実際には、コードが高速になるわけではありません。基盤となるPython関数が一度に1つの値で動作している場合、一度np.vectorizeに1つのアイテムをフィードし、動作全体がかなり遅くなります(基盤となるCまたはFortranの実装を呼び出すnumpy関数を使用する場合と比較して) 。


列の要素のx数が数値よりも小さい数を数えるyには、次のような式を使用できます。

(array['x']<y).sum()

例えば:

import numpy as np
array=np.arange(6).view([('x',np.int),('y',np.int)])
print(array)
# [(0, 1) (2, 3) (4, 5)]

print(array['x'])
# [0 2 4]

print(array['x']<3)
# [ True  True False]

print((array['x']<3).sum())
# 2
于 2011-11-10T11:58:04.460 に答える
14

1 つ以上の条件に基づいて NumPy 配列から要素を選択することは、NumPy の美しく高密度の構文を使用して簡単です。

>>> import numpy as NP
>>> # generate a matrix to demo the code
>>> A = NP.random.randint(0, 10, 40).reshape(8, 5)
>>> A
  array([[6, 7, 6, 4, 8],
         [7, 3, 7, 9, 9],
         [4, 2, 5, 9, 8],
         [3, 8, 2, 6, 3],
         [2, 1, 8, 0, 0],
         [8, 3, 9, 4, 8],
         [3, 3, 9, 8, 4],
         [5, 4, 8, 3, 0]])


列 2 で 6 より大きい要素はいくつありますか?

>>> ndx = A[:,1] > 6
>>> ndx
      array([False,  True, False, False,  True,  True,  True,  True], dtype=bool)
>>> NP.sum(ndx)
      5


A の最後の列の絶対値が 3 より大きい要素はいくつありますか?

>>> A = NP.random.randint(-4, 4, 40).reshape(8, 5)
>>> A
  array([[-4, -1,  2,  0,  3],
         [-4, -1, -1, -1,  1],
         [-1, -2,  2, -2,  3],
         [ 1, -4, -1,  0,  0],
         [-4,  3, -3,  3, -1],
         [ 3,  0, -4, -1, -3],
         [ 3, -4,  0, -3, -2],
         [ 3, -4, -4, -4,  1]])

>>> ndx = NP.abs(A[:,-1]) > 3
>>> NP.sum(ndx)
      0


A の最初の 2 行で 2 以上の要素はいくつあるか?

>>> ndx = A[:2,:] >= 2
>>> NP.sum(ndx.ravel())    # 'ravel' just flattens ndx, which is originally 2D (2x5)
      2

NumPy のインデックス構文は R にかなり近いです。R の流暢さを考えると、このコンテキストでの R と NumPy の主な違いは次のとおりです。

NumPyインデックスは 0 ベースです。R では、インデックスは 1 から始まります。

NumPy (Python など) では、負のインデックスを使用して右から左にインデックスを付けることができます。

# to get the last column in A
A[:, -1], 

# to get the penultimate column in A
A[:, -2] 

# this is a big deal, because in R, the equivalent expresson is:
A[, dim(A)[0]-2]

NumPy はコロン ":" 表記を使用して "unsliced" を示します。たとえば、R では、A の最初の 3 行を取得するには、A[1:3, ] を使用します。NumPy では、A[0:2, :] を使用します (NumPy では、「0」は必要ありません。実際には、A[:2, :] を使用することをお勧めします)。

于 2011-11-10T12:57:55.607 に答える
3

パンダはこれに非常に役立ちます。たとえば、DataFrame.apply()groupby の apply()が役に立ちます。

于 2014-02-04T18:58:54.900 に答える