Найти суммы диагоналей в numpy (быстрее)

У меня есть несколько boardтаких массивов numpy :

array([[0, 0, 0, 1, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 1, 0, 1],
       [0, 0, 0, 0, 0, 0, 0, 1],
       [0, 1, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 1],
       [0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 1, 0],
       [1, 0, 0, 0, 0, 1, 0, 0]])

И я использую следующий код, чтобы найти сумму элементов на каждой n-й диагонали от -7 до 8 доски (и ее зеркальную версию).

n = 8
rate = [b.diagonal(i).sum()
        for b in (board, board[::-1])
        for i in range(-n+1, n)]

После некоторого профилирования эта операция занимает около 2/3 общего времени работы, и, похоже, это связано с двумя факторами:

  • The .диагональный метод строит новый массив вместо представления (похоже, numpy 1.7 будет иметь новый метод .diagдля решения этой проблемы)
  • Итерация выполняется в python внутри понимания списка

Итак, есть ли способы быстрее найти эти суммы (возможно, на уровне C numpy)?


После еще нескольких тестов я смог сократить общее время в 7,5 раз, кэшируя эту операцию... Может быть, я искал не то узкое место?


Еще кое-что:

Только что нашел метод .trace, который заменяет диагональ(i).sum()и... особых улучшений не произошло в производительности (примерно от 2 до 4%).

Итак, проблема должна заключаться в понимании. Есть идеи?

7
задан JBernardo 29 May 2012 в 06:33
поделиться