создание массива с координатами вершин N-мерного куба - PullRequest
0 голосов
/ 07 сентября 2018

Что может быть эффективным способом создания массива-пустышки, содержащего координаты вершин N-мерного куба с центром в начале координат, учитывая размерность N.

Например, для N=1 должно возвращаться np.array([[1],[-1]])

Для N=2 должно возвращаться np.array([[1,1],[1,-1],[-1,1],[-1,-1]])

Для N=3: np.array([[1,1,1],[1,1,-1],[1,-1,1],[1,-1,-1],[-1,1,1],[-1,1,-1],[-1,-1,1],[-1,-1,-1]])

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Вот чистая реализация с использованием meshgrid и stack. Это немного надумано - приветствовал бы вклад, чтобы сделать это лучше.

pts = np.stack(([-1,1],)*N,0)
vertices = (np.array(np.meshgrid(*pts)).T).reshape(2**N,N)
vertices

N=3 возвращает

array([[-1, -1, -1],
       [-1,  1, -1],
       [ 1, -1, -1],
       [ 1,  1, -1],
       [-1, -1,  1],
       [-1,  1,  1],
       [ 1, -1,  1],
       [ 1,  1,  1]])

N=1 возвращает

array([[-1],
       [ 1]])
0 голосов
/ 07 сентября 2018

Вот еще один метод: 2*((np.arange(2**N)[:,None] & (1 << np.arange(N))) > 0) - 1

In [25]: N = 1

In [26]: 2*((np.arange(2**N)[:,None] & (1 << np.arange(N))) > 0) - 1
Out[26]: 
array([[-1],
       [ 1]])

In [27]: N = 2

In [28]: 2*((np.arange(2**N)[:,None] & (1 << np.arange(N))) > 0) - 1
Out[28]: 
array([[-1, -1],
       [ 1, -1],
       [-1,  1],
       [ 1,  1]])

In [29]: N = 3

In [30]: 2*((np.arange(2**N)[:,None] & (1 << np.arange(N))) > 0) - 1
Out[30]: 
array([[-1, -1, -1],
       [ 1, -1, -1],
       [-1,  1, -1],
       [ 1,  1, -1],
       [-1, -1,  1],
       [ 1, -1,  1],
       [-1,  1,  1],
       [ 1,  1,  1]])

Что он делает:

  • Создать массив целых чисел от 0 до 2 ** N-1.
  • Преобразование целых чисел в двоичное (например, 3 становится [1, 1, 0]).
  • Умножьте двоичный массив на 2 и вычтите 1, чтобы преобразовать из 0 и 1 в -1 и 1.

Широкое вещание используется для векторизации операций.

0 голосов
/ 07 сентября 2018

Вы можете использовать product из itertools

from itertools import product

def vertices(N): 
    return list(product((1, -1), repeat=N))

print(vertices(1))
# [(1,), (-1,)]

print(vertices(2))
# [(1, 1), (1, -1), (-1, 1), (-1, -1)]

print(vertices(3))
# [(1, 1, 1), (1, 1, -1), (1, -1, 1), (1, -1, -1), (-1, 1, 1), (-1, 1, -1), (-1, -1, 1), (-1, -1, -1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...