numpy.ndarrayから行の対応は維持したままランダムに選択(行列を削減)

Randomly delete rows and columns of numpy array – StackOverflow

質問の意図が不明瞭なので,ここでは,
各行にfacetなデータがあって,column-wiseに時系列データが含まれているとする.
データ数が膨大なので,行と列をランダムに選択して数を減らしたい,といった場合を考える.

これは(ここでも),ブロードキャストを活用すれば良い.

行と列の意味を考えれば,それぞれ別々にindexerを作ってランダムチョイスすればできる.
column-wiseが時系列データだとすると,順序に意味があるので,ソートする必要.
今はfacetを考えているのでrow-wiseはソートの必要性無いが,
まあ質問のサンプルに合わせてソートしておく.

import numpy as np

R = np.array([
    [3, 0, 5, 3, 0, 1],
    [0, 1, 2, 1, 5, 2],
    [4, 3, 5, 3, 1, 4],
    [2, 5, 2, 5, 3, 1],
    [0, 1, 2, 1, 5, 2],
])

r_ind = np.random.choice(np.arange(5), size=4, replace=False)
r_ind.sort()
r_ind = r_ind[:, np.newaxis]
c_ind = np.random.choice(np.arange(6), size=4, replace=False)
c_ind.sort()
R[r_ind, c_ind]

array([[3, 3, 0, 1],
[0, 1, 5, 2],
[4, 3, 1, 4],
[2, 5, 3, 1]])
 
 
 
文字通り,削除したい場合は,「numpy.delete」を使う.

del_r_ind = np.random.randint(0, 5, size=1)
del_c_ind = np.random.randint(0, 6, size=2)

cp_R = R.copy()
cp_R = np.delete(cp_R, del_r_ind, 0)
np.delete(cp_R, del_c_ind, 1)

array([[0, 5, 3, 0],
[1, 2, 1, 5],
[5, 2, 5, 3],
[1, 2, 1, 5]])

%%timeit
r_ind = np.random.choice(np.arange(5), size=4, replace=False)
r_ind.sort()
r_ind = r_ind[:, np.newaxis]
c_ind = np.random.choice(np.arange(6), size=4, replace=False)
c_ind.sort()
R[r_ind, c_ind]

128 µs ± 1.97 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%%timeit
del_r_ind = np.random.randint(0, 5, size=1)
del_c_ind = np.random.randint(0, 6, size=2)
cp_R = R.copy()
cp_R = np.delete(cp_R, del_r_ind, 0)
np.delete(cp_R, del_c_ind, 1)

127 µs ± 3.79 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit cp_R = R.copy()

820 ns ± 26.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

広告
カテゴリー: 未分類 パーマリンク

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中