Векторизация в python - многомерная матрица по диапазону параметров - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть 10 параметров, и их диапазон составляет от 1 до 10.

Я пытаюсь найти многомерную матрицу (массив) для каждого параметра следующим образом:

def function123(a,b,c,d,e,f,g,j,i,j):
    mat = np.array([a,b,c,d,e,f,g,j,i,j]).reshape(1,10)
    return mat * mat.T # 10 by 10  2D matrix

MAT = np.zeros([10,10,10,10,10,10,10,10,10,10]) #output matrix

for a in range(0,10):
    for b in range(0,10):
        for c in range(0,10):
            for d in range(0,10):
                for e in range(0,10):
                    for f in range(0,10):
                        for g in range(0,10):
                            for h in range(0,10):
                                for i in range(0,10):
                                    for j in range(0,10):
                                        MAT[a,b,c,d,e,f,g,j,i,j] = function123(a,b,c,d,e,f,g,j,i,j) 

Is есть какой-нибудь другой чистый способ решения этой сумасшедшей петли в python? Я просто не хочу видеть петли. = [

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 19 апреля 2020

Комментарии должны соблюдаться, этот код, скорее всего, будет иметь проблемы с памятью (с которыми я тоже столкнулся при попытке). Вероятно, должен быть лучший способ сделать то, что вы делаете, и использовать их для циклов гораздо проще, чем я, по сути. То, как я справился с этой проблемой, было очень приятным, и следующий код хорошо с ней справляется.

def func123(a,b,c,d,e,f,g,i,j,k):
    return a*b*c*d*e*f*g*i*j*k

l = []
for i in range(10):
    arr = np.ones(10,dtype=int)
    arr[i] = 10
    l.append(np.arange(10).reshape(arr))

vec = np.vectorize(func123)
res = vec(l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],l[8],l[9])

Здесь я использовал замечательное свойство широковещания для numpy массивов. Вы можете изменить функцию и сохранить свой массив, если позволяет память.

...