1

dim=2 および shape=(x, y) の 3 つ (または 100) の ndarray が互いに積み重なっていると仮定します。

別の配列の下にある配列内の各インデックスの値は、次のように上にある値に比べて下にある方が小さくなります。

A = 
[ 0 0 1 1
  0 0 0 1 
  0 0 0 0 
  0 0 0 0 ]
B = 
[ 2 2 2 2
  2 2 2 2
  1 2 2 2
  1 1 2 2 ]
C =
[ 3 4 4 3
  3 4 4 4
  2 3 4 4
  2 2 2 4 ]

数値 (たとえば 1.5) を指定して、見つけたい

  for each (x, y) of the ndarrays:
    (1) the index of the stacked array, that has the biggest value below and
    (2) the index of the stacked array, that has the smalest value above the number
that is, the sourunding "bouding layer" of the number)

上記の例の配列の場合、次のようになります: しきい値未満のレイヤーのインデックス

I_biggest_smaller_number = 
[ 0 0 0 0
  0 0 0 0
  1 0 0 0
  1 1 0 0 ]

しきい値を超えるレイヤーのインデックス

I_smallest_bigger_number = 
[ 1 1 1 1
  1 1 1 1
  2 1 1 1
  2 2 1 1]

numpy を使用した最も効率的な方法で。どんな助けでも大歓迎です:)

4

1 に答える 1

1

maxNumPy の、min、およびwhere関数を組み合わせて使用​​したいようです。

を使用numpy.whereすると、基準に基づいてマトリックス エントリのインデックスを見つけることができます。この場合、マトリックス エントリのサブセットの最大値/最小値 (所定の数値より多いまたは少ない) のインデックスが何であるかを尋ねることができます。

これは非常に一口ですが、ここに含まれるコードが役立つことを願っています。ただし注意してください: あなたの例では、B[3,2]との値C[3,2]は同じです。たぶんこれはタイプミスです。ただし、以下のコードでは、これについていくつかの仮定を立てました。

import numpy as np

A = np.array([[0,0,1,1],
              [0,0,0,1],
              [0,0,0,0],
              [0,0,0,0]])

B = np.array([[2,2,2,2],
              [2,2,2,2],
              [1,2,2,2],
              [1,1,2,2]])

C = np.array([[3,4,4,3],
              [3,4,4,4],
              [2,3,4,4],
              [2,2,2,4]])

# I assume the arrays are stacked like this                           
stacked_arrays = np.array([A,B,C])
# So the shape of stacked_arrays in this case is (3,4,4)

n = 1.5 # The example value you gave

I_biggest_smaller_number=np.ndarray((4,4),np.int)
I_smallest_bigger_number=np.ndarray((4,4),np.int)

for x in xrange(stacked_arrays.shape[1]):
    for y in xrange(stacked_arrays.shape[2]):

        # Take values we are interested in; i.e. all values for (x,y)
        temp = stacked_arrays[:,x,y]

        # Find index of maximum value below n
        I_biggest_smaller_number[x,y]=np.where(temp==np.max(temp[np.where(temp<n)]))[0][-1]
# The [-1] takes the highest index if there are duplicates

        # Find index of minimum value above n
        I_smallest_bigger_number[x,y]=np.where(temp==np.min(temp[np.where(temp>n)]))[0][0]
# The [0] takes the lowest index if there are duplicates

print I_biggest_smaller_number
print
print I_smallest_bigger_number
于 2013-05-20T14:04:04.973 に答える