Как создать матрицу NxM с каждым значением столбца в диапазоне (x, y)? - PullRequest
1 голос
/ 26 апреля 2020

Проблема: я хочу создать 5-мерную матрицу numpy, значение каждого столбца которой ограничено диапазоном. Я не могу найти решение онлайн для этой проблемы.

Я пытаюсь создать список правил в виде

Rule: (wordIndex, row, col, dh, dv) 

, где каждый столбец имеет значения в диапазоне ((0-7), (0,11), (0 , 11), (-1,1), (-1,1)). Я хочу генерировать все возможные комбинации.

Я мог бы легко сделать матрицу, используя пять циклов, один внутри другого

m, n = 12, 12
rules =[]
for wordIndex in range(0, 15):
    for row in range(0,m):
        for col in range(0,n):
            for dh in range(-1,2):
                for dv in range(-1,2):
                    rules.append([wordIndex, row, col, dh, dv])

Но этот подход требует экспоненциально большого времени, и мне интересно, есть ли лучший, векторизованный подход к решить эту проблему, используя numpy.

Я пробовал следующее, но, похоже, ни один из них не работает:

rules = np.mgrid[words[0]:words[-1], 0:11, 0:11, -1:1, -1:1]
rules = np.rollaxis(words,0,4)
rules = rules.reshape((len(words)*11*11*3*3, 5))

Еще один сбойный подход:

values = list(itertools.product(len(wordsGiven()), range(11), range(11), range(-1,1), range(-1,1)))

I также попробовал np.arange (), но не могу понять, как использовать if для многомерного массива.

1 Ответ

1 голос
/ 26 апреля 2020

Я думаю, что должен быть лучший способ для этого. Но на всякий случай, если вы не можете найти его, вот способ для хакерского массива:

shape = (8-0, 12-0, 12-0, 2-(-1), 2-(-1))
a = np.zeros(shape)
#create array of indices
a = np.argwhere(a==0).reshape(*shape, len(shape))
#correct the ranges that does not start from 0, here 4th and 5th elements (dh and dv) reduced by -1 (starting range). 
#You can adjust this for any other ranges and elements easily.
a[:,:,:,:,:,3:5] -= 1

Первые несколько элементов:

[[[[[[ 0  0  0 -1 -1]
     [ 0  0  0 -1  0]
     [ 0  0  0 -1  1]]

    [[ 0  0  0  0 -1]
     [ 0  0  0  0  0]
     [ 0  0  0  0  1]]

    [[ 0  0  0  1 -1]
     [ 0  0  0  1  0]
     [ 0  0  0  1  1]]]


   [[[ 0  0  1 -1 -1]
     [ 0  0  1 -1  0]
     [ 0  0  1 -1  1]]

    [[ 0  0  1  0 -1]
     [ 0  0  1  0  0]
     [ 0  0  1  0  1]]

    [[ 0  0  1  1 -1]
     [ 0  0  1  1  0]
     [ 0  0  1  1  1]]]


   [[[ 0  0  2 -1 -1]
     [ 0  0  2 -1  0]
     [ 0  0  2 -1  1]]

    [[ 0  0  2  0 -1]
     [ 0  0  2  0  0]
     [ 0  0  2  0  1]]

    [[ 0  0  2  1 -1]
     [ 0  0  2  1  0]
     [ 0  0  2  1  1]]]


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