Python中的数组操作

时间:2013-02-18 15:28:07

标签: python arrays cycle

如何在Python中执行以下操作:

array_1 = [x1, x2, x3, x4, x5, x6, ....]
array_2 = [y1, y2, y3]

array_3 = [(x1-y1), (x2-y2), (x3-y3), (x4-y1), (x5-y2), (x6-y3)]

array_2中的元素数量始终小于array_1中的元素数量。

array_1array_2具有任意数量的元素。

[num of elements in array_1] mod [number of elements in array_2] = 0

3 个答案:

答案 0 :(得分:10)

from itertools import izip, cycle

array_3 = [a - b for a, b in izip(array_1, cycle(array_2))]

可以容纳array_2的任意大小。

此处itertools.izip()将两个列表中的元素组合成对,itertools.cycle() utility会反复使用第二个列表来提供配对内容。

如果您不需要列表作为输出,只需要迭代结果,您也可以使用itertools.imap()operator.sub

from itertools import imap, cycle
import operator

for result in imap(operator.sub, array_1, cycle(array_2)):
    # do something with the result

对于大型输入列表,这可以节省您必须将中间结果存储在另一个列表中。

答案 1 :(得分:6)

Itertools有大量工具可以解决您的问题

了解您的问题

  1. 其中一个阵列比其他
  2. 较短的数组应为cycled,直到较长的数组耗尽
  3. Create a pair较长的数组和循环的较短数组
  4. Subtract the elements within the pair
  5. 所以这是实现

    >>> arr1 = range(1,10)
    >>> arr2 = range(20,23)
    >>> from operator import sub
    >>> from itertools import izip, cycle, starmap
    >>> list(starmap(sub, izip(arr1, cycle(arr2))))
    [-19, -19, -19, -16, -16, -16, -13, -13, -13]
    

答案 2 :(得分:5)

您可以将operator.submap

一起使用
array_3 = map(operator.sub,array_1,array_2+array_2)

或者,您可以使用zip

执行此操作
array_3 = [x-y for x,y in zip(array_1,array2+array2)]

你可以使用itertools.cycle

摆脱array2的愚蠢连接
array_3 = [x-y for x,y in zip(array_1,cycle(array_2))]