关于无穷范数python 3归一化向量

时间:2018-06-20 20:11:58

标签: python-3.x

这是我正在尝试编写的代码,因此请确保我能帮助您。先感谢您。 编写一个函数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))

3 个答案:

答案 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)

无穷范数是元素绝对值的总和。例如,这是sagemath提供的一个向量,即无穷范数,2-范数和1-范数。

norms

通常,要根据规范对向量进行归一化,您需要将其每个元素除以该规范中的长度。

然后可以用以下方式在Python中表达它:

>>> vec = [-2, 5, 3]
>>> inf_norm = sum([abs(v) for v in vec])
>>> inf_norm
10
>>> normalised_vec = [v/inf_norm for v in vec]
>>> normalised_vec
[-0.2, 0.5, 0.3]