numpy配列のインデックスを取得

Getting index for numpy array – StackOverflow

名前のリストがあり,そのリストに基づいて,インデックスアレイを求めたい場合.

「インデックスを求める」というのを素直に考えれば,ブロードキャストだが,
確かに中規模以下の空間効率を気にしなくて良いレベルでは,十分高速でリーズナブルだが,
もう少し合理的に考えれば,インデックスを求める~挿入位置を求めると考えられる.
この手の処理は,numpy.searchsortedを用いるのがリーズナブルチョイス.
(時間効率,空間効率の観点でベスト)

この処理だけに限れば,Pandasを持ち出すのはオーバーキルで無駄がある.

import numpy as np
import pandas as pd


order= np.array(['Alex', 'Brad', 'Camilla', 'Brad', 'Alex', 'Brad', 'Alex',
           'Camilla', 'Brad', 'Brad'], dtype='<U7')
names = ['Alex','Brad', 'Camilla']
print(np.searchsorted(names, order))

idx = pd.Index(names)
print(idx.get_indexer(order))

order = np.random.choice(order, size=1000000)
res1 = (np.array(names) == order[:, None]).argmax(1)
res2 = np.searchsorted(names, order)
np.testing.assert_array_equal(res1, res2)
%timeit (np.array(names) == order[:, None]).argmax(1)
%timeit np.searchsorted(names, order)
%timeit idx = pd.Index(names);idx.get_indexer(order)
[0 1 2 1 0 1 0 2 1 1]
[0 1 2 1 0 1 0 2 1 1]
10 loops, best of 3: 55.7 ms per loop
10 loops, best of 3: 26.7 ms per loop
10 loops, best of 3: 187 ms per loop
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください