0

次のnumpy配列があるとします:

>>a
array([[0, 0, 2],
       [2, 0, 1],
       [2, 2, 1]])
>>b
array([[2, 2, 0],
       [2, 0, 2],
       [1, 1, 2]])

それから私は垂直に積み重ねます

c=np.dstack((a,b))

その結果:

>>c
array([[[0, 2],
        [0, 2],
        [2, 0]],

       [[2, 2],
        [0, 0],
        [1, 2]],

       [[2, 1],
        [2, 1],
        [1, 2]]])

これから、c の 3 次元ごとに、この部分配列にどの組み合わせが存在するかを確認し、それに応じてリスト一致のインデックスに番号を付けたいと思います。以下を試してみましたが、うまくいきません。アルゴリズムは二重の for ループで十分に単純ですが、c が非常に大きいため、法外に遅くなります。

classes=[(0,0),(2,1),(2,2)]
out=np.select( [h==c for h in classes], range(len(classes)), default=-1)

私の望ましい出力は

out = [[-1,-1,-1],
       [3,  1,-1],
       [2,  2,-1]]
4

3 に答える 3

1

これがあなたが望むものを得る別の方法です。誰かに役立つ場合に備えて投稿すると思います。

import numpy as np

a = np.array([[0, 0, 2],
              [2, 0, 1],
              [2, 2, 1]])
b = np.array([[2, 2, 0],
              [2, 0, 2],
              [1, 1, 2]])
classes=[(0,0),(2,1),(2,2)]

c = np.empty(a.shape, dtype=[('a', a.dtype), ('b', b.dtype)])
c['a'] = a
c['b'] = b
classes = np.array(classes, dtype=c.dtype)
classes.sort()
out = classes.searchsorted(c)
out = np.where(c == classes[out], out+1, -1)
print out
#array([[-1, -1, -1]
#       [ 3,  1, -1]
#       [ 2,  1, -1]])
于 2012-06-01T05:59:51.543 に答える
1

これはどう:

(np.array([np.array(h)[...,:] == c for h in classes]).all(axis = -1) *
         (2 + np.arange(len(classes)))[:, None, None]).max(axis=0) - 1

それはあなたが実際に必要なものを返します

array([[-1, -1, -1],
       [ 3,  1, -1],
       [ 2,  2, -1]])
于 2012-06-01T02:00:21.990 に答える
1

次のように a 配列と b 配列を別々にテストできます。

clsa = (0,2,2)
clesb = (0,1,2)

np.select ( [(ca==a) & (cb==b) for ca,cb in zip (clsa, clsb)], range (3), default = -1)

これにより、目的の結果が得られます (ただし、1,2,3 ではなく 0,1,2 が返されます)。

于 2012-06-01T02:02:35.913 に答える