如何在Python中执行向量化操作?

3

我有一个简单的代码问题,它应该是一个抵押贷款计算器,在表格中列出了从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
在计算D时,您正在以向量化的方式使用u作为数组。由于u是一个列表,这样做是行不通的。为了使您的代码正常工作,您应该使用u = np.array([x / int1 for x in r]) - Sheldore
1
u 是一个列表;你认为 u + 1 应该是什么?又或者,如果给定一组数字的列表,D 应该是什么? - chepner
纯Python数据结构不支持向量化操作。对于向量化操作,请考虑使用numpy库。 - juanpa.arrivillaga
3个回答

4
问题在于u是一个列表,不能用于您在计算D时正在进行的向量化操作。您可以将列表转换为NumPy数组以使您的代码正常工作。
u = np.array([x / int1 for x in r])

另外,您可以使用for循环或列表推导式将u的每个元素的D存储为:

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]

最后一个选项完美地解决了问题!现在看起来像是我忽略了一个非常简单的修复方法,谢谢! - Colin L

4
您目前遇到的错误是因为u是一个列表(通过列表推导创建),而D试图在u(一个列表)和数字之间执行数学运算。这是行不通的。
尝试这个:
import numpy as np
u = np.array([x / int1 for x in r])

你将使用NumPy数组,它允许你进行向量数学运算。如果你以前从未使用过numpy模块,可以使用pip软件包管理器轻松安装。如果没有安装,则

import numpy as np

如果出现错误,您将无法使用NumPy数组。如果您经常进行类似的工作,安装将是值得的。


1
这不是一个完整的答案,你需要解释 为什么 它不起作用。如果您能解释如何解决问题,那对于 OP 来说会很有帮助。 - rahlf23
请告诉我是否足够。 - charley

0
如果将初始列表 r 转换为 NumPy 数组,则可以对其进行矢量化处理。
import numpy as np
from pprint import pprint


l = 350000 #Loan amount
n = 30 #number of years for the loan
r = np.array([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 = r / int1  #vectorised
pprint(list(u))
print()
print()


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

z = (a / D)  #vectorised
pprint(list(z))
print()
print()


# list comprehension alternative, to compare results.
z = [a / ((((i+1)**n)-1) /(i*(i+1)**n)) for i in u]
pprint(list(z))
print()
print()

演示:https://trinket.io/python3/831425cc58

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接