2

内容が異なるサイズ(20000,1)の配列がいくつかあります。配列ごとに同じ行が削除されるように、配列ごとにすべての行の25%をランダムに削除したいと思います。私が見つけたかなり退屈な方法は次のとおりです。

import numpy as np

a=np.array(range(1000))
b=np.array(np.random.rand(1000))
seed=np.random.randint(0,100000000)     #picking a random seed
np.random.seed(seed)      #Setting the same seed for each deletion
a[np.random.rand(*a.shape) < .25] = 0
np.random.seed(seed)
b[np.random.rand(*b.shape) < .25] = 0
a=a[a !=0]
b=b[b !=0]

このアプローチにはいくつかの問題があります。たとえば、配列にすでにゼロが含まれている場合はどうなりますか?これを行うためのより良い方法はありますか?

4

4 に答える 4

6

JoelCornettのソリューションに基づいて拡張されています。

import numpy as np

length = 20000
limit = int(0.75*length)
keep = np.random.permutation(length)[:limit]

newArray = oldArray[keep]
于 2012-08-04T19:37:24.557 に答える
1

非常に一般的な用語での非ナンピーソリューションは次のとおりです。

import random
to_keep = set(random.sample(range(total_rows), keep_ratio * total_rows))

#do this for each array:
new_array = np.array(item for index, item in enumerate(old_array) if index in to_keep)
  • total_rowsは各配列の行数です(これは20,000だったとおっしゃっていたと思います)

  • keep_ratio保持する行の割合であり、あなたによると1 - 0.25 = 0.75

編集

compress()numpyのメソッドを使用することもできます。

import random
to_keep = set(random.sample(range(total_rows), keep_ratio * total_rows))
kompressor = (1 if i in to_keep else 0 for i in xrange(total_rows))

new_array = numpy.compress(kompressor, old_array, axis=1)
kompressor
于 2012-08-04T19:20:28.870 に答える
1

Theodrosの答えに似ていますが、要素の元の順序を保持します。

import numpy as np

mask = np.ones(len(a), dtype=bool)
mask[:len(a)/4] = 0
np.random.shuffle(mask)

a = a[mask]
b = b[mask]
于 2012-08-04T20:16:37.393 に答える
0

これがどれだけうまく機能するかはわかりませんnumpyが、これは純粋なPythonで使用するものです。

total = len(a)
toss = int(0.25 * total)
keeping = [False] * toss + [True] * (total - toss)
random.shuffle(keeping)
a = [value for value, flag in zip(a, keeping) if flag]
b = [value for value, flag in zip(b, keeping) if flag]
于 2012-08-04T19:41:18.723 に答える