2

2 つのインデックス配列があり、間にあるすべてのインデックスをスライス関数のように手動で返したい場合は、次のようになります。

ind1 = np.array([2,6])
ind2 = np.array([2,3])

final = np.array([[2,2,2], [4,5,6]])

スライスする軸が固定されていないため、次のように考えました。

def index_slice(ind1,ind2):
    return np.indices( 1 + ind1 - ind2 ) + ind2[:,np.newaxis,np.newaxis]

final = index_slice(ind1,ind2)

ただし、これは依存し1 + ind1 > ind2 ており、最後のインデックスも含まれています(pythonicではありません)。これを行う関数、またはよりクリーンな実装を知っている人はいますか?
前もって感謝します。ディエゴ

PSこのアイデアがどこから来たのかについての背景を説明します。行列の部分行列を検討していますが、2 つのコーナーのインデックスからそれらにアクセスしたいと考えています。問題の性質上、@ pelsonの回答でわかるように、特定のコーナーが常に同じ方向を向いているとは限りません。

4

1 に答える 1

0

ワンライナーではありませんが、次のようなものは、あなたが求めていると思われる結果を再現します:

def index_slice(arr1, arr2):
    lens = np.abs(arr1 - arr2)
    if not all((lens == max(lens)) | (lens == 0)):
        raise ValueError('The number of indices in some dimensions were inconsistent. Array lengths were %r' % lens)

    max_len = lens.max()
    result = np.empty((len(lens), max_len), dtype=np.int32)

    for dim, (a, b) in enumerate(zip(arr1, arr2)):
        if a == b:
            result[dim, :] = a
        elif a > b:
            result[dim, :] = np.arange(a, b, -1)
        else:
            result[dim, :] = np.arange(a, b)

    return result   

例えば:

>>> ind1 = np.array([2, 6])
>>> ind2 = np.array([2, 3])
>>> print index_slice(ind1, ind2)
[[2 2 2]
 [6 5 4]]


>>> ind1 = np.array([2, 6, 1])
>>> ind2 = np.array([2, 3, 4])
>>> print index_slice(ind1, ind2)
[[2 2 2]
 [6 5 4]
 [1 2 3]]

ただし、この質問をすると、上流のロジックを共有する場合に、より簡単な方法で実行できることをおそらく実行しているという疑いが生じます。

HTH

于 2012-07-30T21:55:32.243 に答える