>>> import numpy as np
>>> X = np.arange(27).reshape(3, 3, 3)
>>> x = [0, 1]
>>> X[x, x, :]
array([[ 0, 1, 2],
[12, 13, 14]])
Мне нужно суммировать его по измерению 0
, но в реальном мире матрица огромна, и я бы предпочел суммировать ее по измерению -1
, что быстрее из-за расположения памяти. Следовательно, я хотел бы, чтобы результат был транспонирован:
array([[ 0, 12],
[ 1, 13],
[ 2, 14]])
Как я могу это сделать? Я хотел бы, чтобы результат «расширенной индексации» numpy был неявно транспонирован. Транспонировать его явно с .T
в конце еще медленнее и не вариант.
Update1: в реальном мире расширенная индексация неизбежна, а одинаковые индексы не гарантируются.
>>> x = [0, 0, 1]
>>> y = [0, 1, 1]
>>> X[x, y, :]
array([[ 0, 1, 2],
[ 3, 4, 5],
[12, 13, 14]])
Update2: чтобы уточнить, что это не проблема XY, вот собственно проблема:
У меня есть большая матрица X
, которая содержит элементы x
из некоторого распределения вероятностей. Распределение вероятности элемента зависит от окрестности элемента. Этот дистрибутив неизвестен, поэтому я следую процедуре выборки Гиббса, чтобы построить матрицу, состоящую из элементов из этого распределение. В двух словах это означает, что я делаю некоторое начальное предположение для матрицы X
, а затем продолжаю перебирать элементы матрицы X
, обновляя каждый элемент x
формулой, которая зависит от соседних значений x
. Итак, для любого элемента матрицы мне нужно получить его соседей (расширенная индексация) и выполнить над ними некоторую операцию (суммирование в моем примере). Я использовал line_profiler
, чтобы увидеть, что строка, которая занимает большую часть времени в моем коде, берет сумму массива относительно измерения 0
, а не -1
. Поэтому я хотел бы знать, есть ли способ создать уже транспонированную матрицу в результате расширенной индексации.
numpy.transpose
, выполнить эту работу, так как она компилируется в C.! - person kasravnd   schedule 28.12.2014-1
в макете памяти по умолчаниюC
является самым быстрым (местность). Вот почему мне нужно, чтобы новый массив, который всегда создается с помощью расширенной индексации, был транспонирован --- таким образом я смогу суммировать по самому быстрому индексу. - person alisianoi   schedule 28.12.2014X = np.random.randn(100, 100, 100); X.sum(-1)
у меня самый быстрый (с коэффициентом 0,6:1);X.sum(1)
лишь немного быстрее, чемX.sum(0)
(примерно в 0,9:1). Смотрите мой комментарий ниже. - person senderle   schedule 29.12.2014X.sum(0)
занимает 819 долларов США,X.sum(1)
- 861 доллар США, аX.sum(2)
- 887 долларов США. В вашем примере вы можете подтвердить, чтоX.flags.c_contiguous == True
? - person ali_m   schedule 29.12.2014X.flags.c_contiguous
этоTrue
. Отредактировано: повторно подтверждено после вашего комментария ниже. - person senderle   schedule 29.12.2014-1
должно быть самым быстрым, если только я не ошибаюсь катастрофически. Но я думаю, что все ставки сняты, это зависит от архитектуры или версииnumpy
. Я использую Intel Mac со встроеннымnumpy
версии 1.6.2. - person senderle   schedule 29.12.2014