В основном все вышеперечисленное: избавьтесь от сути, предоставьте MCVE, который доказуемо работает (возможно, только для 1D или 2D, и настолько прост, насколько это возможно, у вас слишком сложно), предоставьте входные и выходные данные и сфокусируйтесь на одном вопросе.

аюсь реализовать идею, которую я предложилВот, заПродукт Коши многомерных конечных степенных рядов (то есть многочленов), представленных в виде NumPy ndarrays.numpy.convolve выполняет работу для одномерных массивов соответственно. Но, насколько мне известно, нет реализации свертки для произвольных размерных массивов. В приведенной выше ссылке я предложил уравнение:

для свертки двухn размерные массивыPhi формыP=[p1,...,pn] а такжеPsi формыQ=[q1,...,qn], где:

omegas являются элементамиn размерный массивOmega формыO=P+Q-1<A,B>_F это обобщениеФробениус внутренний продукт для произвольных размерных массивовA а такжеB той же формыA^F являетсяA перевернул всеn направления{A}_[k1,...,kn] кусочекA начиная с[0,...,0] в[k1,...,kn]Psi' являетсяPsi расширены нулями, чтобы иметь формуO как определено выше

Я попытался реализовать вышеупомянутые функции одну за другой:

import numpy as np
def crop(A,D1,D2):
    return A[tuple(slice(D1[i], D2[i]) for i in range(D1.shape[0]))]

как было предложеноВот, ломтики / посевыA изD1 вD2,

def sumall(A):
    sum1=A
    for k in range(A.ndim):
        sum1 = np.sum(sum1,axis=0)
    return sum1 

это обобщениеnumpy.sum для многомерных ndarrays,

def flipall(A):
    A1=A
    for k in range(A.ndim):
        A1=np.flip(A1,k)
    return A1

переворачиваетсяA это все существующие оси, и, наконец,

def conv(A,B,K):
    D0=np.zeros(K.shape,dtype=K.dtype)
    return sumall(np.multiply(crop(A,np.maximum(D0,np.minimum(A.shape,K-B.shape)) \
                           ,np.minimum(A.shape,K)), \
                      flipall(crop(B,np.maximum(D0,np.minimum(B.shape,K-A.shape)) \
                           ,np.minimum(B.shape,K)))))

гдеK=[k1,...,kn] и для всех0<=kj<=oj, является модифицированной версией формулы выше, которая только вычисляет ненулевые умножения, чтобы быть более эффективной. Сейчас я пытаюсь заселитьOmega использование массиваfromfunction или жеmeshgrid в сочетании сvectorize как предложеноВот, но я потерпел неудачу до сих пор. Теперь мои вопросы в порядке очередности:

Как я могу реализовать последний шаг и заполнить последний массив эффективным и питонным способом?Есть ли более эффективные реализации функций выше? Или как бы вы реализовали формулу?мое уравнение правильно? Означает ли это умножение многомерных конечных степенных рядов?разве другие не реализовали это раньше в NumPy или я изобретаю колесо здесь? Буду признателен, если вы укажете мне другие решения.

Буду признателен, если вы поможете мне с этими вопросами. Заранее благодарны за Вашу помощь.

P.S.1 Вы можете найти некоторые примеры и другую информацию в этомGitHub Gist

P.S.2 Здесь, в списке рассылки AstroPy Мне сказали, чтоscipy.signal.convolve и / илиscipy.ndimage.convolve сделайте работу и для более высоких измерений. Также естьscipy.ndimage.filters.convolve. Вот Я объяснил, почему они не то, что я ищу.

Ответы на вопрос(0)

Ваш ответ на вопрос