3

不適切な値 (0 は不適切であることを示します) を含む 2 次元データがあります。私の目標は、それぞれの悪い値を、悪くない最も近い値に置き換えることです。

SciPyNearestNDInterpolatorはこれを行う良い方法のようです。2 次元の場合、(点の数) x 2 のインデックスの配列と、補間する対応する値の (点の数) x 1 の配列を受け入れます。

したがって、インデックスと値のサブセット、つまり「適切な」ものを取得する必要があります。以下のコードはこれを実現しますがcoordinates = array(list(ndindex(n_y, n_x)))where(values != 0)[0]両方とも面倒です。これを行うためのよりクリーンな方法はありますか?

# n_y and n_x are the number of points along each dimension.

coordinates = array(list(ndindex(n_y, n_x)))

values = data.flatten()
nonzero_ind = where(values != 0)[0]

nonzero_coordinates = coordinates[nonzero_ind, :]
nonzero_values = values[nonzero_ind]

ありがとう。

4

3 に答える 3

4
nonzero_coordinates = np.argwhere(data != 0)
nonzero_values = np.extract(data, data)

または単に:

nonzero_values = data[data!=0]

最初は明らかなnonzero_values方法を見逃していましたが、コメントの @askewchan に感謝します。

于 2013-09-25T13:59:28.307 に答える
1

したがって、インデックスと値のサブセット、つまり「適切な」ものを取得する必要があります。

悪いインデックスの「マスク」を作成した場合は、そのマスクの否定を取り、~を使用してマスクからインデックスを見つけることができますnp.where。例えば:

import numpy as np

# Sample array
Z = np.random.random(size=(5,5))

# Use whatever criteria you have to mark the bad indices
bad_mask  = Z<.2

good_mask = ~bad_mask
good_idx  = np.where(good_mask)

print good_mask
print good_idx

例として、次のように示します。

[[ True  True  True  True False]
 [ True False False  True  True]
 [ True False  True  True  True]
 [ True  True  True  True  True]
 [ True  True  True  True  True]]
(array([0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4]), array([0, 1, 2, 3, 0, 3, 4, 0, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4]))
于 2013-09-25T13:56:00.560 に答える
1

この問題に完全に取り組む別の方法は、それらの穴を自動的に「閉じる」画像フィルターを介して配列を実行することです。scipy.ndimageと呼ばれるには、次のようなフィルターがありますgrey_closing

>>> from scipy import ndimage

>>> a = np.arange(1,26).reshape(5,5)
>>> a[2,2] = 0
>>> a
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12,  0, 14, 15],
       [16, 17, 18, 19, 20],
       [21, 22, 23, 24, 25]])

>>> a = np.arange(1,26).reshape(5,5)

>>> ndimage.grey_closing(a, size=2)
array([[ 7,  7,  8,  9, 10],
       [ 7,  7,  8,  9, 10],
       [12, 12, 13, 14, 15],
       [17, 17, 18, 19, 20],
       [22, 22, 23, 24, 25]])

しかし、これには残念なエッジの影響があります (パラメーターで少し変更できますmode)。これを回避するには、元の配列が 0 だった場所から新しい値を取得し、それらを元の配列に配置します。

>>> np.where(a, a, ndimage.grey_closing(a, size=2))
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 12, 14, 15],
       [16, 17, 18, 19, 20],
       [21, 22, 23, 24, 25]])

または、 scikit-imageを使用できます。

>>> from skimage.morphology import closing, square
>>> a = np.arange(1,10, dtype=np.uint8).reshape(3,3)
>>> a[1,1] = 0

>>> a
array([[1, 2, 3],
       [4, 0, 6],
       [7, 8, 9]], dtype=uint8)

>>> closing(a, square(2))
array([[1, 2, 3],
       [4, 4, 6],
       [7, 8, 9]], dtype=uint8)

>>> a
array([[1, 2, 3],
       [4, 0, 6],
       [7, 8, 9]], dtype=uint8)

それを出力配列として与えるaと、クローズはその場で行われます。

>>> closing(a, square(2), a)
>>> a
array([[1, 2, 3],
       [4, 4, 6],
       [7, 8, 9]], dtype=uint8)

squareゼロのギャップが大きい場合は、より大きな(または skimage.morphology の任意の形状) を使用します。これの欠点 (依存関係は別として) は、uint8.

于 2013-09-25T16:05:56.580 に答える