Перезаписать столбцы каждой строки массива numpy на основе другого массива numpy - PullRequest
0 голосов
/ 01 мая 2018

У нас есть основной массив с именем main_arr , и мы хотим преобразовать его в другой массив с именем result с таким же размером, используя guide_arr , снова с таким же размером:

import numpy as np
main_arr = np.array([[3, 7, 4], [2, 5, 6]])
guide_arr = np.array([[2, 0, 1], [0, 2, 1]])
result = np.zeros(main_arr.shape)

нам нужен результат, равный:

if np.array_equal(result, np.array([[7, 4, 3], [2, 6, 5]])):
    print('success!')

Как мы должны использовать guide_arr ?

guide_arr [0,0] равно 2, что означает, что результат [0,2] = main_arr [0,0]

guide_arr [0, 1] равно 0, что означает, что результат [0, 0] = main_arr [0, 1]

guide_arr [0, 2] равно 1, что означает, что результат [0, 1] = main_arr [0,2]

То же самое относится и к строке 1.

В итоге, элементы в main_arr должны быть переупорядочены (в пределах строки, строка никогда не изменяется), чтобы их индекс нового столбца равнялся числу в guide_arr.

1 Ответ

0 голосов
/ 01 мая 2018
In [199]: main_arr = np.array([[3, 7, 4], [2, 5, 6]])
     ...: guide_arr = np.array([[2, 0, 1], [0, 2, 1]])
     ...: 

Обычный способ переупорядочения столбцов, в котором порядок строк различается, заключается в следующем:

In [200]: main_arr[np.arange(2)[:,None],guide_arr]
Out[200]: 
array([[4, 3, 7],
       [2, 6, 5]])

arange(2)[:,None] - это массив столбцов, который вещает с индексным массивом (2,3).

Мы можем применить ту же идею к использованию guide_arr для идентификации столбцов в result:

In [201]: result = np.zeros_like(main_arr)
In [202]: result[np.arange(2)[:,None], guide_arr] = main_arr
In [203]: result
Out[203]: 
array([[7, 4, 3],
       [2, 6, 5]])

Это может прояснить, как работает трансляция:

In [204]: np.broadcast_arrays(np.arange(2)[:,None], guide_arr)
Out[204]: 
[array([[0, 0, 0],
        [1, 1, 1]]), 
 array([[2, 0, 1],
        [0, 2, 1]])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...