Из двумерного массива создайте еще один двумерный массив, состоящий из случайно выбранных значений из исходного массива (значения, не разделяемые между строками), без использования цикла - PullRequest
0 голосов
/ 31 декабря 2018

Чтобы выбрать случайные значения из 2-мерного массива, вы можете использовать этот

pool =  np.random.randint(0, 30, size=[4,5])
seln = np.random.choice(pool.reshape(-1), 3, replace=False)

print(pool)
print(seln)

>[[29  7 19 26 22]
 [26 12 14 11 14]
 [ 6  1 13 11  1]
 [ 7  3 27  1 12]]
[11 14 26]

, пул должен быть преобразован в 1-й вектор, потому что np.random.choice не может обрабатывать 2-мерные объекты.Таким образом, чтобы создать двумерный массив, состоящий из случайно выбранных значений из исходного двумерного массива, мне пришлось делать по одной строке за раз, используя цикл.

pool =  np.random.randint(0, 30, size=[4,5])
seln = np.empty([4,3], int)

for i in range(0, pool.shape[0]):
    seln[i] =np.random.choice(pool[i], 3, replace=False) 

print('pool = ', pool)
print('seln = ', seln)

>pool =  [[ 1 11 29  4 13]
 [29  1  2  3 24]
 [ 0 25 17  2 14]
 [20 22 18  9 29]]
seln =  [[ 8 12  0]
 [ 4 19 13]
 [ 8 15 24]
 [12 12 19]]

Однако я ищу параллельный метод;обработка всех строк одновременно, а не по одному в цикле.

Возможно ли это?Если нет, как насчет Tensorflow?

1 Ответ

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

Вот способ избежать циклов for:

pool =  np.random.randint(0, 30, size=[4,5])
print(pool)
array([[ 4, 18,  0, 15,  9],
       [ 0,  9, 21, 26,  9],
       [16, 28, 11, 19, 24],
       [20,  6, 13,  2, 27]])

# New array shape
new_shape = (pool.shape[0],3)

# Indices where to randomly choose from
ix = np.random.choice(pool.shape[1], new_shape)
array([[0, 3, 3],
       [1, 1, 4],
       [2, 4, 4],
       [1, 2, 1]])

Таким образом, строки ix представляют собой набор случайных индексов, из которых будет производиться выборка pool.Теперь каждая строка масштабируется в соответствии с формой pool, чтобы ее можно было отбирать при выравнивании:

ixs = (ix.T + range(0,np.prod(pool.shape),pool.shape[1])).T
array([[ 0,  3,  3],
       [ 6,  6,  9],
       [12, 14, 14],
       [16, 17, 16]])

И ixs можно использовать для выборки из pool с помощью:

pool.flatten()[ixs].reshape(new_shape)
array([[ 4, 15, 15],
       [ 9,  9,  9],
       [11, 24, 24],
       [ 6, 13,  6]]) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...