Делайте векторы членов из кортежей в Python, сохраняя при этом дальнейшие подсписки - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть массив numpy.

a = np.array([[1,2], [2,4], [3,6]])
and `np.array([[1,2,3],[2,4,6]])` is wanted.

И в этом вопросе было установлено, что для выравнивания пар в 2 отдельных новых векторах, по одному для каждого члена пары, мы должны использовать a.T транспонирование матрицы.

Однако это не применяется, если встраиваемые массивы дополнительно встраиваются.

>>>b
array([[[1, 2],
        [3, 4]],
       [[1, 2],
        [3, 4]],
       [[1, 2],
        [3, 4]],
       [[1, 2],
        [3, 4]]])

Я хочу:

>>>b.operation
    array([[[1, 2],[1, 2],[1, 2],[1, 2]]
           [[3, 4],[3, 4],[3, 4],[3, 4]]])

Но я получаю

>>>b.T
array([[[1, 1, 1, 1],
        [3, 3, 3, 3]],
       [[2, 2, 2, 2],
        [4, 4, 4, 4]]])

Что, конечно, имеет смысл, поскольку транспозиция, кажется, переворачивает форму. (4, 2, 2) -> (2, 2, 4) Но

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

b in mem : 1234123412341234
b.T in mem : 1111333322224444

это никак не сработает.

i'd need : 1212121234343434

Какой-нибудь совет, как правильно или эффективно справиться с этим?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Вы можете достичь желаемого результата, указав оси для транспонирования. Что быстрее, если вы не возражаете против немного более громоздкого синтаксиса.

import numpy as np
b= np.array([[[1, 2], [3, 4]],
             [[1, 2], [3, 4]],
             [[1, 2], [3, 4]],
             [[1, 2], [3, 4]]])

%timeit b.transpose((1,0,2))
# 393 ns ± 11.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit np.rollaxis(b, 1)
# 1.8 µs ± 52 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Выход составляет (форма 2,4,2)

array([[[1, 2],
        [1, 2],
        [1, 2],
        [1, 2]],

       [[3, 4],
        [3, 4],
        [3, 4],
        [3, 4]]])

по желанию.

0 голосов
/ 06 ноября 2018

Использование np.moveaxis . Я нашел это, посмотрев на подпрограммы манипулирования массивом .

Для вашего случая использования это демонстрирует желаемое использование:

In [1]: a = np.array([[1,2], [2,4], [3,6]])

In [2]: b = np.array([
   ...:     [[1, 2],
   ...:      [3, 4]],
   ...:     [[1, 2],
   ...:      [3, 4]],
   ...:     [[1, 2],
   ...:      [3, 4]],
   ...:     [[1, 2],
   ...:      [3, 4]]])
   ...:

In [3]: np.moveaxis(a, 0, 1)
Out[3]:
array([[1, 2, 3],
       [2, 4, 6]])

In [4]: np.moveaxis(b, 0, 1)
Out[4]:
array([[[1, 2],
        [1, 2],
        [1, 2],
        [1, 2]],

       [[3, 4],
        [3, 4],
        [3, 4],
        [3, 4]]])

Перед редактированием этого ответа я рекомендовал np.rollaxis (в этом случае вы должны использовать np.rollaxis(a, 1)), но затем я заметил в этой связанной документации, что рекомендуется np.moveaxis.

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