0

A[i] = A[i] * B[i] + C[i]我需要帮助解决在每个索引处使用规则询问数字列表(所有数字列表的长度都相同)的问题i。在此之后每个A[i]ifA[i] < 0返回 -1.0,否则返回 1.0。

到目前为止我有

def Vecombine(A, B, C):
    for i in range(len(A)):
        A[i] = A[i] * B[i] + C[i]
        return A[i]
    if A[i] < 0:
        return (-1.0)

我知道我需要以某种方式添加另一个循环来跟踪最终返回的正面和负面,但我对如何做到这一点有点困惑。我也可能无法编写这段代码......我正在尝试,但我只是不完全理解 python。

4

4 回答 4

2

您可以为此使用列表理解或生成器

def Vecombine(a, b, c):
    return (-1.0 if i * j + k < 0 else 1.0 for i, j, k in zip(a, b, c))

相关文件:

编辑:如果你想变异a

def Vecombine(a, b, c):
    for i in xrange(len(a)):
        a[i] = -1.0 if a[i] * b[i] + c[i] < 0 else 1.0
于 2013-10-31T04:46:53.080 回答
0

灵感来自inspectorG4dget

from itertools import izip
from math import copysign

def Vecombine(A, B, C):
""" Assuming A, B, C are lists of same length, process them and return
    1.0 if the result is positive or -1.0 if the result is negative. """
    for i, (a, b, c) in enumerate(izip(A, B, C)):
        A[i] = a * b + c
    S = [copysign(1, el) for el in A] 
    return (A, S)

我把它保存在test.py. 然后使用以下值对其进行测试:

from test import Vecombine

a = [1, 3, 5, 7]
b = [-1, -1, 1, 1]
c = [0, 0, 0, 0]

print "a = ", a
print "b = ", b
print "c = ", c

(ans, sign) = Vecombine(a, b, c)

print "Answers: ", ans
print "Signs: ", sign

这会用计算结果覆盖您的原始数组。S然后在 中保存相应值的符号A,即 1.0 表示正值,-1.0 表示使用copysign的负值。

** 但是,它似乎在a每次运行时都会覆盖 的值。这将需要解决。

于 2013-10-31T05:29:59.770 回答
0
In [84]: %paste
def Vecombine(A,B,C):
  for i,(a,b,c) in enumerate(itertools.izip(A,B,C)):
    A[i] = a*b + c

## -- End pasted text --

In [85]: A = range(1,5)

In [86]: B = range(5,9)

In [87]: C = range(9,13)

In [88]: len(A)==len(B)==len(C)
Out[88]: True

In [89]: A
Out[89]: [1, 2, 3, 4]

In [90]: Vecombine(A,B,C)

In [91]: A
Out[91]: [14, 22, 32, 44]
于 2013-10-31T04:47:22.857 回答
0

我认为这不会像你想象的那样工作,对于每个 A[i],它只会从函数返回。您可以将 A[i] 的值替换为 -1.0 或 1.0 并最终返回 A,但是一旦第一个索引从函数返回,它就完成了。此外,除非它的格式不正确,否则它将始终返回 A[0]。也许这就是你想要的。

def Vecombine(A,B,C):
    l = []
    for i in range(len(A)):
        A[i]=A[i] * B[i] + C[i]
    if A[i]<0:
        l.append(-1.0)
    else:
        l.append(1.0)
    return l

在函数结束时, l 将有 [-1.0, -1.0, 1.0, 1.0, etc...]

于 2013-10-31T04:48:22.777 回答