Python中的数组操作

3 投票
3 回答
1011 浏览
提问于 2025-04-17 16:16

我想在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的元素数量是任意的。

[array_1中的元素数量] 除以 [array_2中的元素数量] 的结果是0。

3 个回答

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 来避免把数组2和自己拼接在一起,这样就显得没必要了。

array_3 = [x-y for x,y in zip(array_1,cycle(array_2))]
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() 这个工具会不断重复使用第二个列表中的元素,来提供配对的对象。

如果你不需要输出一个列表,只是想遍历结果,可以使用 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

对于很大的输入列表,这样做可以避免把中间结果存储在另一个列表里。

6

Itertools有很多工具可以帮助你解决问题

理解你的问题

  1. 其中一个数组比另一个短
  2. 短的数组应该被循环使用,直到长的数组用完
  3. 创建一个配对,把长数组和循环的短数组配在一起
  4. 对每一对中的元素进行相减

下面是实现的代码

>>> 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]

撰写回答