4

ベクトルのリスト、スカラーのリスト、およびタプルで表される開始点があります。

vecs = [(1,1), (2,3), (-1,1)]
scalars = [2, 3, 2]
start = (-5,0)

ポイントにベクトルを「k倍」追加する機能があります。

def add_vector(point, k, vec):
    return (point[0]+k*vec[0], point[1]+k*vec[1])

次のようなポリライン上のポイントのリストを取得したいと思います。

result[0] = start
result[n+1] = add_vector(result[n], scalars[n], vecs[n]) 

私は使用することを考えitertools.accumulateましたが、func引数は2つの引数の関数でなければなりません. 何か案は ?

4

3 に答える 3

1

...を使用する代わりに、ジェネレーター関数を作成できることがわかりましたitertools.accumulate...

def accumulate_vector(start, scalars, vecs):
    prev = start
    yield start
    for k, vec in zip(scalars, vecs):
        prev = add_vector(prev, k, vec)
        yield prev
于 2016-05-09T14:38:57.833 に答える
0

add_vector (次のコードでは func() ) のヘルパー関数を追加するのはどうでしょうか。

from itertools import accumulate

def add_vector(point, k, vec):
    return (point[0]+k*vec[0], point[1]+k*vec[1])

def func(data1, data2): # data : a tuple (vector, scalar)
    vec1, k1 = data1
    vec2, k2 = data2
    return (add_vector(vec1, k2, vec2), k2)

vecs = [(1,1), (2,3), (-1,1)]
scalars = [2, 3, 2]
start = (-5,0)

temp = zip([start]+vecs, [1]+scalars)
result = [data[0] for data in accumulate(temp, func)]

print(result) # [(-5, 0), (-3, 2), (3, 11), (1, 13)]
于 2016-05-09T14:43:50.063 に答える