Обведите 2D-массив 1D-массивом по часовой стрелке — NumPy / Python

#python #python-3.x #numpy

#python #python-3.x #numpy

Вопрос:

Допустим, есть два массива:

 inner_array = np.array([[3, 3, 3],
                        [6, 6, 6],
                        [9, 9, 9]])

outer_array = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16])
  

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

 [[ 1,  2,  3,  4, 5],
 [16,  3,  3,  3, 6],
 [15,  6,  6,  6, 7],
 [14,  9,  9,  9, 8],
 [13, 12, 11, 10, 9]]
  

Было бы еще лучше, если бы можно было контролировать начальную позицию внешнего массива

Ответ №1:

Вот один из способов выбора начальной позиции в качестве дополнительного аргумента —

 def fill_around(inner_array, outer_array, origin=0):
    outer_array = np.roll(outer_array, origin)
    m,n = inner_array.shape
    out = np.pad(inner_array,(1,1))
    
    s = np.split(outer_array, np.cumsum([n 2,m,n 2]))
    out[[0,-1]] = [s[0],s[2][::-1]]
    out[1:-1,::n 1] = np.dstack([s[3][::-1],s[1]])
    return out
  

Пример запуска для заданных данных —

 In [181]: fill_around(inner_array, outer_array)
Out[181]: 
array([[ 1,  2,  3,  4,  5],
       [16,  3,  3,  3,  6],
       [15,  6,  6,  6,  7],
       [14,  9,  9,  9,  8],
       [13, 12, 11, 10,  9]])
  

Установите начальную позицию —

 In [8]: fill_around(inner_array, outer_array, origin=2)
Out[8]: 
array([[15, 16,  1,  2,  3],
       [14,  3,  3,  3,  4],
       [13,  6,  6,  6,  5],
       [12,  9,  9,  9,  6],
       [11, 10,  9,  8,  7]])
  

Комментарии:

1. вы действительно эксперт в numpy 🙂 1