Как выполнять векторизованные операции в Python? - PullRequest
0 голосов
/ 26 октября 2018

У меня проблема с моим простым кодом, предполагающим, что это ипотечный калькулятор, в котором все ставки от 0,03 до 0,18 указаны в таблице.Вот мой код и ошибка.

l = 350000 #Loan amount
n = 30 #number of years for the loan
r = [0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.10,0.11,0.12,0.13,0.14,0.15,0.16,0.17,0.18] #interest rate in decimal

n = n * 12
a = l
int1 = 12
u = [x / int1 for x in r]

D = (((u+1)**n)-1) /(u*(u+1)**n)

z = (a / D)
print(z)

File "test.py", line 23, in <module>
    D = (((u+1)**n)-1) /(u*(u+1)**n)
TypeError: can only concatenate list (not "int") to list

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

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

Попробуйте:

import numpy as np
u = np.array([x / int1 for x in r])

u будет массивом NumPy , что позволит вам выполнять с ним векторную математику.Если вы никогда не использовали модуль numpy, его легко установить с помощью диспетчера пакетов pip .Если он не установлен,

import numpy as np

выдаст ошибку, и вы не сможете использовать массив NumPy.Если вы обнаружите, что часто выполняете аналогичную работу, скорее всего, это стоит установки.

0 голосов
/ 26 октября 2018

Проблема в том, что u - это список, который нельзя использовать для векторизованной операции, которую вы выполняете во время вычисления D. Вы можете преобразовать свой список в массив NumPy, чтобы ваш код работал.

u = np.array([x / int1 for x in r])

Кроме того, вы можете использовать цикл for или понимание списка, чтобы сохранить D для каждого элемента u как

D = [(((i+1)**n)-1) /(i*(i+1)**n) for i in u]

, но он снова будет жаловаться во время z = (a / D), потому что D по-прежнему список. Поэтому преобразование в массив представляется удобным подходом.

Другой альтернативный ответ - вычислить z, используя непосредственное понимание списка, без использования дополнительной переменной D

z = [a / (((i+1)**n)-1) /(i*(i+1)**n) for i in u]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...