3

問題を説明するための小さなコードを次に示します。

A = array([[1,2], [1,0], [5,3]])
f_of_A = f(A)   # this is precomputed and expensive


values = array([[1,2], [1,0]])


# location of values in A
# if I just had 1d values I could use numpy.in1d here
indices = array([0, 1])


# example of operation type I need (recalculating f_of_A as needed is not an option)
f_of_A[ indices ]

したがって、基本的には、高次元の in1d に相当するものが必要だと思います。そのようなものは存在しますか?それとも他のアプローチがありますか?

searchsorted() 関数もあるように見えますが、それは 1 次元配列でも機能するようです。この例では 2 次元の点を使用しましたが、どのソリューションも 3 次元の点に対しても機能する必要があります。

4

2 に答える 2

2

さて、これが私が思いついたものです。

1 つの多次元インデックスの値を見つけるには、次のようii = np.array([1,2])にします。

n.where((A == ii).all(axis=1))[0]

A == iiこれを分解してみましょiiA。行全体を true にしたいので、.all(axis=1)それらを折りたたむために追加します。これらのインデックスが発生する場所を見つけるために、これをプラグインしてnp.where、タプルの最初の値を取得します。

現在、複数のインデックスでこれを行う簡単な方法はまだありません (ただし、1 つあると感じています)。ただし、これで作業が完了します。

np.hstack([np.where((A == values[i]).all(axis=1))[0] for i in xrange(len(values))])

これは基本的に、 の値ごとに上記を呼び出し、values結果を連結するだけです。

アップデート:

これは多次元の場合です(すべて一度に、かなり高速になるはずです):

np.where((np.expand_dims(A, -1) == values.T).all(axis=1).any(axis=1))[0]
于 2013-07-22T20:55:15.987 に答える
1

np.in1dすべての座標が dtype の単一の変数に折りたたまれた元の配列のビューを使用できますnp.void

import numpy as np

A = np.array([[1,2], [1,0], [5,3]])
values = np.array([[1,2], [1,0]])

# Make sure both arrays are contiguous and have common dtype
common_dtype = np.common_type(A, values)
a = np.ascontiguousarray(A, dtype=common_dtype)
vals = np.ascontiguousarray(values, dtype=common_dtype)

a_view = A.view((np.void, A.dtype.itemsize*A.shape[1])).ravel()
values_view = values.view((np.void,
                           values.dtype.itemsize*values.shape[1])).ravel()

a_viewとの各アイテムvalues_viewはすべて 1 点の座標がまとめられているため、使用する 1D マジックは何でも実行できます。np.in1dただし、インデックスを見つけるために使用する方法がわからないので、次のnp.searchsortedルートに進みます。

sort_idx = np.argsort(a_view)
locations = np.searchsorted(a_view, values_view, sorter=sort_idx)
locations = sort_idx[locations]

>>> locations
array([0, 1], dtype=int64)
于 2013-07-22T20:59:13.647 に答える