Numpy ValueError в функции трансляции с большим количеством измерений - PullRequest
1 голос
/ 05 апреля 2019

Вероятно, это репост, но я не уверен, какую формулировку использовать для заголовка.

Я пытаюсь вычесть значения массивов внутри массивов, изменив их форму для создания большего массива.

xn = np.array([[1,2,3],[4,5,6]])
yn = np.array(([1,2,3,4,5], [6,7,8,9,10]])

xn.shape
Out[42]: (2, 3)

yn.shape
Out[43]: (2, 5)

Мне нужна следующая функциональность:

yn.reshape(2,-1,1) - xn

Это выдает ошибку значения, но приведенное ниже прекрасно работает, когда я удаляю первое измерение как фактор:

yn.reshape(2,-1,1)[0] - xn[0]
Out[44]: 
array([[ 0, -1, -2],
       [ 1,  0, -1],
       [ 2,  1,  0],
       [ 3,  2,  1],
       [ 4,  3,  2]])

Какой будет первый выход, который я ожидал, потому что оба xn и yn имеют первое измерение 2.

Есть ли правильный способ сделать это с желаемой трансляцией?

Желаемый вывод:

array([[[ 0, -1, -2],
        [ 1,  0, -1],
        [ 2,  1,  0],
        [ 3,  2,  1],
        [ 4,  3,  2]],
       [[2, 1, 0],
        [3, 2, 1],
        [4, 3, 2],
        [5, 4, 3],
        [6, 5, 4]]])

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Из правил вещания , чтобы иметь возможность вещать, формы должны быть равны или одна из них должна быть равна 1 (начиная с конечных измерений и продвигаясь вперед).Таким образом, замена двух последних измерений xn позволит вам транслировать (после добавления другого измерения в xn):

yn.reshape(2, -1, 1) - xn.reshape(2, -1, 1).swapaxes(-1, -2)
array([[[ 0, -1, -2],
        [ 1,  0, -1],
        [ 2,  1,  0],
        [ 3,  2,  1],
        [ 4,  3,  2]],

       [[ 2,  1,  0],
        [ 3,  2,  1],
        [ 4,  3,  2],
        [ 5,  4,  3],
        [ 6,  5,  4]]])

Форма yn.reshape(2, -1, 1) равна (2, 5, 1), а форма xn.reshape(2, -1, 1).swapaxes(-1, -2) это (2, 1, 3).Теперь вы можете транслировать, потому что измерения равны или одно из них равно для поэлементного сравнения, начиная с конечных измерений.

1 голос
/ 05 апреля 2019
>>> x
array([[1, 2, 3],
       [4, 5, 6]])
>>> y
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10]])
>>> z = y.reshape(2,-1,1)

Добавить еще одну ось к x:

>>> z-x[:,None,:]
array([[[ 0, -1, -2],
        [ 1,  0, -1],
        [ 2,  1,  0],
        [ 3,  2,  1],
        [ 4,  3,  2]],

       [[ 2,  1,  0],
        [ 3,  2,  1],
        [ 4,  3,  2],
        [ 5,  4,  3],
        [ 6,  5,  4]]])
>>>

Или просто:

>>> y[...,None] - x[:,None,:]
array([[[ 0, -1, -2],
        [ 1,  0, -1],
        [ 2,  1,  0],
        [ 3,  2,  1],
        [ 4,  3,  2]],
       [[ 2,  1,  0],
        [ 3,  2,  1],
        [ 4,  3,  2],
        [ 5,  4,  3],
        [ 6,  5,  4]]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...