2

ndarray 内の各データポイントの要素数をカウントするにはどうすればよいですか?

私がやりたいことは、ndarray に少なくとも N 回存在するすべての値に対して OneHotEncoder を実行することです。

また、出現回数が N 回未満のすべての値を、配列に出現しない別の要素 (new_value と呼びましょう) に置き換えたいと考えています。

たとえば、私は持っています:

import numpy as np

a = np.array([[[2], [2,3], [3,34]],
              [[3], [4,5], [3,34]],
              [[3], [2,3], [3,4] ]]])

しきい値 N=2 の場合、次のようなものが必要です。

b = [OneHotEncoder(a[:,[i]])[0] if count(a[:,[i]])>2 
else OneHotEncoder(new_value) for i in range(a.shape(1)]

したがって、onehotencoder を考慮せず、new_value=10 を使用するのではなく、必要な置換を理解するためだけに、配列は次のようになります。

a = np.array([[[10], [2,3], [3,34]],
                [[3], [10], [3,34]],
                [[3], [2,3], [10] ]]])
4

1 に答える 1

6

このようなものはどうですか?

最初に、配列内の一意の要素の数を数えます。

>>> a=np.random.randint(0,5,(3,3))
>>> a
array([[0, 1, 4],
       [0, 2, 4],
       [2, 4, 0]])
>>> ua,uind=np.unique(a,return_inverse=True)
>>> count=np.bincount(uind)
>>> ua
array([0, 1, 2, 4]) 
>>> count
array([3, 1, 2, 3]) 

uaとの配列から、count0 が 3 回表示され、1 が 1 回表示される、というように表示されます。

import numpy as np

def mask_fewest(arr,thresh,replace):
    ua,uind=np.unique(arr,return_inverse=True)
    count=np.bincount(uind)
    #Here ua has all of the unique elements, count will have the number of times 
    #each appears.


    #@Jamie's suggestion to make the rep_mask faster.
    rep_mask = np.in1d(uind, np.where(count < thresh))
    #Find which elements do not appear at least `thresh` times and create a mask

    arr.flat[rep_mask]=replace 
    #Replace elements based on above mask.

    return arr


>>> a=np.random.randint(2,8,(4,4))
[[6 7 7 3]
 [7 5 4 3]
 [3 5 2 3]
 [3 3 7 7]]


>>> mask_fewest(a,5,50)
[[10  7  7  3]
 [ 7  5 10  3]
 [ 3  5 10  3]
 [ 3  3  7  7]]

上記の例の場合: 2D 配列または 3D 配列のどちらを意図しているか教えてください。

>>> a
[[[2] [2, 3] [3, 34]]
 [[3] [4, 5] [3, 34]]
 [[3] [2, 3] [3, 4]]]


>>> mask_fewest(a,2,10)
[[10 [2, 3] [3, 34]]
 [[3] 10 [3, 34]]
 [[3] [2, 3] 10]]
于 2013-07-24T23:51:11.670 に答える