我有两个元组列表。
x = [(A1, B1, C1), (A2, B2, C2),...(AN, BN, CN)]
和
y = [(A1_, B1_, C1_), (A2_, B2_, C2_),...(AN_, BN_, CN_)]
我想做以下事情:
[(A1, B1, C1 - C1_), (A2, B2, C2 -
C2_),...(AN, BN, CN - CN_)]
我冒昧地说,Numpy中的某些内容可以让我这样做,但我仍然没有挖出如何只对元组中的一个元素进行操作,所以我会感激任何可能的帮助。 感谢。
答案 0 :(得分:3)
如果您从x
和y
作为元组列表开始,那么很容易将它们转换为2D NumPy数组:
import numpy as np
x = np.array([(1,2,3), (4,5,6), (7,8,9)])
y = np.array([(10,20,30), (40,50,60), (70,80,90)])
然后创建类似于
的数组[(A1, B1, C1 - C1_), (A2, B2, C2 - C2_),...(AN, BN, CN - CN_)]
你可以这样做:
z = x[:] # make a copy of array x
z[:,2] -= y[:,2] # subtract the 3rd column of y from z
print(z)
产量
[[ 1 2 -27]
[ 4 5 -54]
[ 7 8 -81]]
并获得
[C1 - C1_, C2 - C2_,...]
您可以使用z[:, 2]
或直接从x
和y
使用x[:, 2] - y[:, 2]
获取:
[-27 -54 -81]
我可能会误解你的问题,但当你说“我仍然没有挖出如何在元组中的一个元素上进行操作”时,它会让我觉得你可能正在存储元组在NumPy数组中。如果这是真的,那么我建议你重新考虑使用NumPy的方式:
你看,当你使用dtype=object
在NumPy数组(例如元组)中存储Python对象时,对这些对象进行的所有操作最终都涉及对Python函数的调用,而不是更快的C / Fortran NumPy通常调用的编译函数。
因此,虽然您可能喜欢使用NumPy语法来选择数组中的项目,但与普通Python对象相比,您没有获得任何速度优势。实际上,它可能比使用普通Python对象(例如元组列表)慢。
出于这个原因,我建议尽可能避免将Python对象存储在NumPy数组中,特别是当这些对象是数字时,因为NumPy的本机数字dtypes服务得更好。
不是在数组中存储3元组,最好在NumPy数组中添加一个额外的维度(所谓的“轴”),并沿着这个轴存储3个组件。
一旦你这样做,你想到的数值计算就是小菜一碟。可以通过以下方式完成:
x[:,2]-y[:,2]
答案 1 :(得分:1)
没有numpy:
>>> x = [(1,2,3), (4,5,6), (7,8,9)]
>>> y = [(10,20,30), (40,50,60), (70,80,90)]
>>> [ (a[0], a[1], a[2] - b[2]) for a, b in zip(x, y) ]
[(1, 2, -27), (4, 5, -54), (7, 8, -81)]
>>> [ a[2] - b[2] for a, b in zip(x, y) ]
[-27, -54, -81]