web-dev-qa-db-ja.com

NumPy配列の要素のインデックス

Pythonでは、.index()を使用して配列内の値のインデックスを取得できます。 NumPy配列でどうすればよいですか?

しようとすると

decoding.index(i)

numPyライブラリはこの関数をサポートしていないと言っています。それを行う方法はありますか?

44
Marc Ortiz

np.whereを使用して、特定の条件がTrueであるインデックスを取得します。

例:

2D np.ndarrayと呼ばれるaの場合:

i, j = np.where(a == value)

1D配列の場合:

i, = np.where(a == value)

>=<=!=などの条件で機能します...

index()メソッドでnp.ndarrayのサブクラスを作成することもできます。

class myarray(np.ndarray):
    def __new__(cls, *args, **kwargs):
        return np.array(*args, **kwargs).view(myarray)
    def index(self, value):
        return np.where(self == value)

テスト:

a = myarray([1,2,3,4,4,4,5,6,4,4,4])
a.index(4)
#(array([ 3,  4,  5,  8,  9, 10]),)
76

numpy配列をリストに変換し、そのインデックスを取得できます。

例えば

tmp = [1,2,3,4,5] #python list
a = numpy.array(tmp) #numpy array
i = list(a).index(2) # i will return index of 2, which is 1

私はあなたが欲しいものです。

13
Statham

NumPy配列のインデックスを実装するこれらの2つの方法の間で私は破れています。

idx = list(classes).index(var)
idx = np.where(classes == var)

どちらも同じ文字数を取りますが、最初のメソッドはnumpy.ndarrayではなくintを返します。

7
jlansey

この問題は numpy_indexed ライブラリを使用して効率的に解決できます(免責事項:私はその著者です)。このタイプの問題に対処するために作成されました。 npi.indicesは、list.indexのn次元の一般化として表示できます。 (指定された軸に沿って)nd-arrayに作用します。また、一度に1つのアイテムではなく、ベクトル化された方法で複数のエントリを検索します。

a = np.random.Rand(50, 60, 70)
i = np.random.randint(0, len(a), 40)
b = a[i]

import numpy_indexed as npi
assert all(i == npi.indices(a, b))

このソリューションは、以前に投稿された回答よりも時間の複雑さ(n log nが最悪)が高く、完全にベクトル化されています。

4

関数numpy.nonzero()、または配列のnonzero()メソッドを使用できます

import numpy as np

A = np.array([[2,4],
          [6,2]])
index= np.nonzero(A>1)
       OR
(A>1).nonzero()

出力

(array([0, 1]), array([1, 0]))

出力の最初の配列は行インデックスを示し、2番目の配列は対応する列インデックスを示します。

1
N.Moudgil

インデックスに興味がある場合、最良の選択はnp.argsort(a)です

a = np.random.randint(0, 100, 10)
sorted_idx = np.argsort(a)
0
Victor Zuanazzi