Объединение одного массива NumPy в новый массив NumPy с равным количеством значений - PullRequest
0 голосов
/ 10 декабря 2018

Допустим, у меня есть массив numpy, состоящий из 100.000 нулей и 10.000.000 единиц.

Как разделить / объединить этот массив в новый массив, где одинаково много единиц и нулей?

ОБНОВЛЕНИЕ

Цель -взять 100.000 нулей и 100.000 единиц из большого массива и создать новый массив, где 50% массива - это нули, а остальные 50% - это единицы.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Из комментариев я понимаю, вам нужны индексы всех нулей и случайные 100'000.

# make example
>>> A = np.repeat((0,1), (10**5, 10**7))
>>> np.random.shuffle(A)

# convert to bool
>>> m = A.astype(bool)
# put an additional 100'000 zeros ...
>>> B = np.repeat((False, True), (10**5, 10**7 - 10**5))
>>> np.random.shuffle(B)
# ... at positions that used to be one
>>> m[m] = B
# and get the indices of zeros
>>> idx, = np.where(~m)

# check
>>> idx
array([       1,       22,      180, ..., 10099911, 10099950, 10099969])
>>> len(idx)
200000
>>> A[idx]
array([0, 1, 1, ..., 1, 1, 0])
>>> A[idx].sum()
100000
0 голосов
/ 10 декабря 2018

Если я правильно понимаю, вам нужна только минимальная длина обоих массивов, N.

Получив ее, вам не нужно трогать исходные массивы, вы можете просто создать новыйone и shuffle это так:

import numpy as np
N = 10
a = np.concatenate((np.ones(N), np.zeros(N)))
np.random.shuffle(a)

Вот пример в консоли:

>>> import numpy as np
>>> N = 10
>>> a = np.concatenate((np.ones(N), np.zeros(N)))
>>> a
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0.])
>>> np.random.shuffle(a)
>>> a
array([0., 0., 1., 1., 1., 0., 1., 0., 0., 0., 0., 0., 1., 1., 0., 1., 1.,
       0., 1., 1.])
>>> len(a)
20
>>> sum(a)
10.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...