Я не совсем уверен, что вы пытаетесь сделать, но есть некоторые ускорения, которые вы можете сделать, чтобы создать матрицу. Предложение Braincore использовать numpy.sinc
- это первый шаг, но второй заключается в том, чтобы понять, что функции numpy хотят работать с массивами numpy, где они могут делать циклы на скорости C и делать это быстрее, чем на отдельные элементы.
def resampleMatrix(Tso, Tsf, o, f):
retval = numpy.sinc((Tsi*numpy.arange(i)[:,numpy.newaxis]
-Tso*numpy.arange(j)[numpy.newaxis,:])/Tso)
return retval
Хитрость в том, что, индексируя апельсины с помощью numpy.newaxis, numpy преобразует массив с формой i в единицу с формой i x 1, а массив с формой j - в форму 1 x j. На этапе вычитания numpy будет «транслировать» каждый вход, чтобы действовать как массив в форме i x j, и выполнять вычитание. («Трансляция» - это термин «numpy», отражающий тот факт, что для увеличения размера i x 1 до i x j не создается дополнительная копия).
Теперь numpy.sinc может перебирать все элементы в скомпилированном коде, гораздо быстрее, чем любой цикл for, который вы можете написать.
(Существует дополнительное ускорение, если вы выполняете деление до вычитания, тем более что в последнем случае деление отменяется.)
Единственным недостатком является то, что теперь вы платите за дополнительный массив Nx10 * N, чтобы удержать разницу. Это может быть нарушителем, если N большое, а память - проблема.
В противном случае вы сможете написать это, используя numpy.convolve
. Из того, что я только что узнал о sinc-интерполяции, я бы сказал, что вы хотите что-то вроде numpy.convolve(orig,numpy.sinc(numpy.arange(j)),mode="same")
. Но я, вероятно, ошибаюсь по поводу специфики.