Выбор numpy элементов массива - PullRequest
0 голосов
/ 11 марта 2020

У меня есть задача выбора p% элементов в данном массиве numpy. Например,

# Initialize 5 x 3 array-
x = np.random.randint(low = -10, high = 10, size = (5, 3))

x
'''
array([[-4, -8,  3],
       [-9, -1,  5],
       [ 9,  1,  1],
       [-1, -1, -5],
       [-1, -4, -1]])
'''

Теперь я хочу выбрать, скажем, p = 30% чисел в x, поэтому 30% чисел в x равно 5 (округлено в большую сторону).

Есть ли способ выбрать эти 30% чисел в x? Где p может измениться, а размерность numpy array x может быть 3-D или, возможно, больше.

Я использую Python 3.7 и numpy 1.18.1

Спасибо

Ответы [ 3 ]

1 голос
/ 11 марта 2020

Вы можете использовать np.random.choice для выборки без замены из массива 1d numpy:

p = 0.3
np.random.choice(x.flatten(), int(x.size * p) , replace=False)

Для больших массивов производительность выборки без замены может быть довольно плохой, но есть некоторые обходные .

0 голосов
/ 13 марта 2020

Я нашел способ выбора p% из numpy элементов:

p = 20

# To select p% of elements-
x_abs[x_abs < np.percentile(x_abs, p)]

# To select p% of elements and set them to a value (in this case, zero)-
x_abs[x_abs < np.percentile(x_abs, p)] = 0
0 голосов
/ 11 марта 2020

Вы можете случайно выбрать 0,1 и использовать np.nonzero и логическое индексирование:

np.random.seed(1)
x[np.nonzero(np.random.choice([1, 0], size=x.shape, p=[0.3,0.7]))]

Вывод:

array([ 3, -1,  5,  9, -1, -1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...