Python: перебор циклов и списка - PullRequest
0 голосов
/ 03 апреля 2020

Как перебирать списки для размещения большего количества элементов, если в списке 'U' было больше элементов? В частности, строка ниже:


for i in range(u+1):
    x_matrix[i] = [pow(x[i],U[0]),pow(x[i],U[1]),pow(x[i],U[2]),pow(x[i],U[3])]

Полный код:


import numpy as np

x = [-3, -2, -1, 0, 1, 2, 3]
y = [0, -4, 0, 6, 8, 0,-24]

ys = []

def check(lst):
    result = False;

    if len(lst) > 0 :
        result = all(elem == lst[0] for elem in lst)

    if result is True:
        print("All Elements in List are Equal")
        print(lst)
    else:        
        print("All Elements in List are Not Equal")
        print(lst)
        a = []
        a = [j-i for i, j in zip(lst[:-1], lst[1:])]
        ys.append(a)
        check(a)

check(y)
u = len(ys)
print('\nThe coordinates results in {}-th order polynomial.\n'.format(u))

U = list(range(u+1))
list.reverse(U)

x_matrix = [None]*(u+1)

for i in range(u+1):
    x_matrix[i] = [pow(x[i],U[0]),pow(x[i],U[1]),pow(x[i],U[2]),pow(x[i],U[3])]

y_matrix = [v for k,v in enumerate(y[0:u+1])]

# AX = Y, Ainv dot Y = X
A = np.array(x_matrix)
Y = np.array(y_matrix)
Ainv = np.linalg.inv(A)
X = Ainv.dot(Y)
print(X)

Спасибо.

Ответы [ 2 ]

4 голосов
/ 03 апреля 2020

Вот один из способов векторизации для l oop. [None] и [:,None] необходимы для того, чтобы массивы имели совместимую форму.

import numpy as np

x = np.array([-3, -2, -1, 0, 1, 2, 3])
n = 5

x[:,None] ** np.arange(n+1,0,-1)[None]
# note that x[:,None].shape[1] == np.arange(n+1,0,-1)[None].shape[0]

print(x[:,None] ** np.arange(n+1,0,-1)[None])
[[ 729 -243   81  -27    9   -3]
 [  64  -32   16   -8    4   -2]
 [   1   -1    1   -1    1   -1]
 [   0    0    0    0    0    0]
 [   1    1    1    1    1    1]
 [  64   32   16    8    4    2]
 [ 729  243   81   27    9    3]]
1 голос
/ 03 апреля 2020

Хочешь что-нибудь подобное?

for i in range(u+1):
    x_matrix[i] = [pow(x[i], elem) for elem in U]

Если да, есть лучший способ. Почему вы не пытаетесь так:

x_matrix = [[pow(x[idx_elem], elem) for elem in U] for idx_elem in range(u+1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...