这是我正在尝试编写的代码,因此请确保我能帮助您。先感谢您。 编写一个函数normalize(vector),该函数接受一个向量并返回关于无穷范数的标准化向量。即(1 / infNorm(vector))*向量。
def normalize(vector):
infNorm(vector) = abs(vector[0])
for i in vector:
if abs(i) > norm:
infNorm(vector) = abs(i)
finalvector = (1/infNorm(vector)) * vector
return finalvector
vector = [2, 5, 7]
print(normalize(vector))
答案 0 :(得分:2)
如果要使用for循环在python中查找数组的最大值,我建议将normalize函数分为两个函数,一个用于获取无穷范数,另一个用于计算向量,如下所示:例如:
def infNorm(vector):
norm = vector[0]
for element in vector:
if norm < abs(element):
norm = abs(element)
return norm
def normalize(vector):
norm = infNorm(vector)
new_vector = []
for element in vector:
new_vector.append((1.0/norm)*element)
return new_vector
否则,您可以使用python中的max()内置函数,通过该函数,代码将如下所示:
def normalize(vector):
norm = abs(max(vector, key=abs))
new_vector = []
for element in vector:
new_vector.append((1.0/norm)*element)
return new_vector
顺便说一句,当您在符号后加上括号时,您将尝试调用一个函数。因此,当您执行infNorm(vector) = abs(vector[0])
时,您正在尝试为函数调用分配一个值,这将导致语法错误。正确的方法就是infNorm = abs(vector[0])
。
答案 1 :(得分:2)
您正在使用()
与序列索引[]
混淆函数调用参数。所谓序列,是指Python序列,其中包括元组和列表。在这里,您将列表用作向量。 (您也可以使用元组,但前提是您不打算修改它们。因此,为了通用和简单起见,我们将坚持使用列表。)
此外,您需要两个循环:一个用于查找规范,一个用于应用规范。
def infnorm(vector):
norm = 0
for i in range(len(vector)):
if abs(vector[i]) > norm:
norm = vector[i]
return norm
def normalize(vector):
norm = infnorm(vector)
return [v/norm for v in vector]
vector = [2, 5, 7]
print(normalize(vector))
结果:
[0.2857142857142857, 0.7142857142857143, 1.0]
请注意,在标准化之前,我没有获取每个元素的绝对值。我不是向量向导,所以可能是错误的,但是我猜测归一化向量可能具有负值。
最后一个棘手的位,即normalize(vector)
的返回值,称为“列表理解”。使用公式构建列表是一个不错的python技巧。乍一看,它们看起来很奇怪,但是稍加练习,它就会变得容易,而且非常精确和清晰。看看。
答案 2 :(得分:0)