загрузочный массив numpy 2D - PullRequest
3 голосов
/ 22 мая 2019

Я пытаюсь сэмплировать с заменой двумерного массива base 2D в форме (4,2) на строки, скажем, 10 раз. Окончательный результат должен быть трехмерным массивом.

Пробовал код ниже, это работает. Но есть ли способ сделать это без цикла for?

base=np.array([[20,30],[50,60],[70,80],[10,30]])
print(np.shape(base))
nsample=10
tmp=np.zeros((np.shape(base)[0],np.shape(base)[1],10))
for i in range(nsample):
    id_pick = np.random.choice(np.shape(base)[0], size=(np.shape(base)[0]))
    print(id_pick)
    boot1=base[id_pick,:]
    tmp[:,:,i]=boot1
print(tmp)

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Вы можете использовать функцию stack из numpy.Ваш код будет выглядеть так:

base=np.array([[20,30],[50,60],[70,80],[10,30]])
print(np.shape(base))
nsample=10
tmp = []
for i in range(nsample):
    id_pick = np.random.choice(np.shape(base)[0], size=(np.shape(base)[0]))
    print(id_pick)
    boot1=base[id_pick,:]
    tmp.append(boot1)
tmp = np.stack(tmp, axis=-1)
print(tmp)
0 голосов
/ 22 мая 2019

Вот один векторизованный подход -

m,n = base.shape
idx = np.random.randint(0,m,(m,nsample))
out = base[idx].swapaxes(1,2)

Основная идея состоит в том, что мы генерируем все возможные индексы с np.random.randint как idx. Это будет массив формы (m,nsample). Мы используем этот массив для индексации во входном массиве вдоль первой оси. Таким образом, он выбирает случайные строки с base. Чтобы получить окончательный результат с формой (m,n,nsample), нам нужно поменять местами последние две оси.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...