20

形状が(30,480,640)のnumpy ndarrayがあり、1番目と2番目の軸は場所(緯度と経度)を表し、0番目の軸には実際のデータポイントが含まれています。各場所で0番目の軸に沿って最も頻度の高い値を使用したいと思います。 (1,480,640).ieの形状の新しい配列を作成することです。

>>> data
array([[[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]],

       [[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]],

       [[40, 40, 42, 43, 44],
        [45, 46, 47, 48, 49],
        [50, 51, 52, 53, 54],
        [55, 56, 57, 58, 59]]])

(perform calculation)

>>> new_data 
array([[[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]]])

データポイントには、負の浮動小数点数と正の浮動小数点数が含まれます。どうすればそのような計算を実行できますか?どうもありがとう!

numpy.uniqueで試しましたが、「TypeError:unique()に予期しないキーワード引数'return_inverse'」が表示されました。Unixにインストールされているnumpyバージョン1.2.1を使用していますが、return_inverseをサポートしていません。モードですが、そのような大量のデータを処理するには永遠に時間がかかります...それで、最も頻繁な値を取得する別の方法はありますか?再度、感謝します。

4

5 に答える 5

24

フラット配列の最も頻繁な値を見つけるにはunique、と を使用bincountargmaxます。

arr = np.array([5, 4, -2, 1, -2, 0, 4, 4, -6, -1])
u, indices = np.unique(arr, return_inverse=True)
u[np.argmax(np.bincount(indices))]

多次元配列を操作するには、 について心配する必要はありませんが、 onuniqueを使用する必要があります。apply_along_axisbincount

arr = np.array([[5, 4, -2, 1, -2, 0, 4, 4, -6, -1],
                [0, 1,  2, 2,  3, 4, 5, 6,  7,  8]])
axis = 1
u, indices = np.unique(arr, return_inverse=True)
u[np.argmax(np.apply_along_axis(np.bincount, axis, indices.reshape(arr.shape),
                                None, np.max(indices) + 1), axis=axis)]

あなたのデータで:

data = np.array([
   [[ 0,  1,  2,  3,  4],
    [ 5,  6,  7,  8,  9],
    [10, 11, 12, 13, 14],
    [15, 16, 17, 18, 19]],

   [[ 0,  1,  2,  3,  4],
    [ 5,  6,  7,  8,  9],
    [10, 11, 12, 13, 14],
    [15, 16, 17, 18, 19]],

   [[40, 40, 42, 43, 44],
    [45, 46, 47, 48, 49],
    [50, 51, 52, 53, 54],
    [55, 56, 57, 58, 59]]])
axis = 0
u, indices = np.unique(arr, return_inverse=True)
u[np.argmax(np.apply_along_axis(np.bincount, axis, indices.reshape(arr.shape),
                                None, np.max(indices) + 1), axis=axis)]
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

NumPy 1.2 ですよね?np.unique(return_inverse=True)を使用して合理的に効率的に概算できますnp.searchsorted(これは追加の O( n log n ) であるため、パフォーマンスを大幅に変更するべきではありません)。

u = np.unique(arr)
indices = np.searchsorted(u, arr.flat)
于 2012-09-06T12:32:40.307 に答える
8

SciPy のモード関数を使用します。

import numpy as np
from scipy.stats import mode

data = np.array([[[ 0,  1,  2,  3,  4],
                  [ 5,  6,  7,  8,  9],
                  [10, 11, 12, 13, 14],
                  [15, 16, 17, 18, 19]],

                 [[ 0,  1,  2,  3,  4],
                  [ 5,  6,  7,  8,  9],
                  [10, 11, 12, 13, 14],
                  [15, 16, 17, 18, 19]],

                 [[40, 40, 42, 43, 44],
                  [45, 46, 47, 48, 49],
                  [50, 51, 52, 53, 54],
                  [55, 56, 57, 58, 59]]])

print data

# find mode along the zero-th axis; the return value is a tuple of the
# modes and their counts.
print mode(data, axis=0)
于 2012-09-06T20:05:50.860 に答える
0

flattenあなたの配列、それから構築しcollections.Counterます。いつものように、浮動小数点数を比較するときは特に注意してください。

于 2012-09-06T10:34:48.023 に答える