Построить 2d пирамидальный массив - Python / NumPy - PullRequest
5 голосов
/ 12 апреля 2019

Некоторое время я ломал голову над созданием этого массива, но безуспешно делал это в векторизованном виде.

Мне нужна функция, которая принимает двумерный массив размера n и создает двумерный массив размера (n, n), который выглядит следующим образом:

n = 6

np.array([[0,0,0,0,0,0],
          [0,1,1,1,1,0],
          [0,1,2,2,1,0],
          [0,1,2,2,1,0],
          [0,1,1,1,1,0],
          [0,0,0,0,0,0],

(и может принимать аргументы с нечетным числом)

Любые предложения будут высоко оценены, спасибо!

Ответы [ 2 ]

7 голосов
/ 12 апреля 2019

Подход № 1

Мы можем использовать broadcasting -

def pyramid(n):
    r = np.arange(n)
    d = np.minimum(r,r[::-1])
    return np.minimum.outer(d,d)

Подход № 2

Мы также можем использовать concatenation для создания d, вот так -

d = np.r_[np.arange(n//2),np.arange(n//2-(n%2==0),-1,-1)]

Таким образом, давая нам альтернативный однострочный -

np.minimum.outer(*(2*[np.r_[np.arange(n//2),np.arange(n//2-(n%2==0),-1,-1)]]))

Образецработает -

In [83]: pyramid(5)
Out[83]: 
array([[0, 0, 0, 0, 0],
       [0, 1, 1, 1, 0],
       [0, 1, 2, 1, 0],
       [0, 1, 1, 1, 0],
       [0, 0, 0, 0, 0]])

In [84]: pyramid(6)
Out[84]: 
array([[0, 0, 0, 0, 0, 0],
       [0, 1, 1, 1, 1, 0],
       [0, 1, 2, 2, 1, 0],
       [0, 1, 2, 2, 1, 0],
       [0, 1, 1, 1, 1, 0],
       [0, 0, 0, 0, 0, 0]])

In [85]: pyramid(8)
Out[85]: 
array([[0, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 1, 1, 1, 1, 1, 0],
       [0, 1, 2, 2, 2, 2, 1, 0],
       [0, 1, 2, 3, 3, 2, 1, 0],
       [0, 1, 2, 3, 3, 2, 1, 0],
       [0, 1, 2, 2, 2, 2, 1, 0],
       [0, 1, 1, 1, 1, 1, 1, 0],
       [0, 0, 0, 0, 0, 0, 0, 0]])
2 голосов
/ 12 апреля 2019

Использование numpy.pad:

import numpy as np

def pyramid(n):
    if n % 2:
        arr = np.zeros((1,1))
        N = int((n-1)/2)
    else:
        arr = np.zeros((2,2))
        N = int(n/2)-1

    for i in range(N):
        arr += 1
        arr = np.pad(arr, 1, mode='constant')
    return arr

Выход:

pyramid(6)
array([[0., 0., 0., 0., 0., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 1., 2., 2., 1., 0.],
       [0., 1., 2., 2., 1., 0.],
       [0., 1., 1., 1., 1., 0.],
       [0., 0., 0., 0., 0., 0.]])

pyramid(5)
array([[0., 0., 0., 0., 0.],
       [0., 1., 1., 1., 0.],
       [0., 1., 2., 1., 0.],
       [0., 1., 1., 1., 0.],
       [0., 0., 0., 0., 0.]])

numpy.pad(arr, 1, 'constant') возвращает arr, завернутый в 1 слой нулей.

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