87

200未満の行列(2次元配列)のすべての値をカウントする必要があります。

このために書き留めたコードは次のとおりです。

za=0   
p31 = numpy.asarray(o31)   
for i in range(o31.size[0]):   
    for j in range(o32.size[1]):   
        if p31[i,j]<200:   
            za=za+1   
print za

o31は画像であり、それを行列に変換してから値を見つけています。

これを行うためのより簡単な方法はありますか?

4

6 に答える 6

113

これはブール配列では非常に簡単です。

p31 = numpy.asarray(o31)
za = (p31 < 200).sum() # p31<200 is a boolean array, so `sum` counts the number of True elements
于 2012-10-21T08:32:56.487 に答える
106

機能はあなたのnumpy.where友達です。配列データ型を最大限に活用するように実装されているため、大きな画像の場合、提供する純粋なPythonソリューションよりも速度が向上することに気付くはずです。

numpy.whereを直接使用すると、特定の値が条件に一致するかどうかを示すブールマスクが生成されます。

>>> data
array([[1, 8],
       [3, 4]])
>>> numpy.where( data > 3 )
(array([0, 1]), array([1, 1]))

また、マスクを使用して配列に直接インデックスを付け、実際の値を取得できます。

>>> data[ numpy.where( data > 3 ) ]
array([8, 4])

そこから正確にどこから取得するかは、結果をどのような形式にするかによって異なります。

于 2012-10-21T08:11:00.107 に答える
30

これを実現するには、フラット化してフィルター処理する方法や単純に列挙する方法など、さまざまな方法がありますが、ブール値/マスク配列を使用するのが最も簡単な方法だと思います(iircの方がはるかに高速です)。

>>> y = np.array([[123,24123,32432], [234,24,23]])
array([[  123, 24123, 32432],
       [  234,    24,    23]])
>>> b = y > 200
>>> b
array([[False,  True,  True],
       [ True, False, False]], dtype=bool)
>>> y[b]
array([24123, 32432,   234])
>>> len(y[b])
3
>>>> y[b].sum()
56789

更新

nneonneoが回答したように、しきい値を超える要素の数だけが必要な場合は、次のようにするだけです。

>>>> (y>200).sum()
3

これはより簡単な解決策です。


との速度比較filter

### use boolean/mask array ###

b = y > 200

%timeit y[b]
100000 loops, best of 3: 3.31 us per loop

%timeit y[y>200]
100000 loops, best of 3: 7.57 us per loop

### use filter ###

x = y.ravel()
%timeit filter(lambda x:x>200, x)
100000 loops, best of 3: 9.33 us per loop

%timeit np.array(filter(lambda x:x>200, x))
10000 loops, best of 3: 21.7 us per loop

%timeit filter(lambda x:x>200, y.ravel())
100000 loops, best of 3: 11.2 us per loop

%timeit np.array(filter(lambda x:x>200, y.ravel()))
10000 loops, best of 3: 22.9 us per loop

*** use numpy.where ***

nb = np.where(y>200)
%timeit y[nb]
100000 loops, best of 3: 2.42 us per loop

%timeit y[np.where(y>200)]
100000 loops, best of 3: 10.3 us per loop
于 2012-10-21T08:13:37.877 に答える
10

これは、派手なインデックスを使用し、中間値として実際の値を持つバリアントです。

p31 = numpy.asarray(o31)
values = p31[p31<200]
za = len(values)
于 2012-10-21T14:35:34.237 に答える
6

numpy配列でxより大きい値の数をカウントするには、次を使用できます。

n = len(matrix[matrix > x])

ブールインデックスは、条件(matrix> x)が満たされる要素のみを含む配列を返します。次に、len()はこれらの値をカウントします。

于 2018-12-03T19:39:55.070 に答える
1

numpy.count_nonzeroを使用して、全体を1つのライナーに変換できます。

za = numpy.count_nonzero(numpy.asarray(o31)<200)  #as written in the code
于 2021-02-17T17:31:45.570 に答える