如果您以 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 将 Python 对象存储在 NumPy 数组(例如元组)中时,对这些对象执行的所有操作最终都涉及对 Python 函数的调用,而不是更快的 C/Fortran 编译函数NumPy 通常调用的。
因此,虽然您可能会喜欢 NumPy 语法来选择数组中的项目,但与普通 Python 对象相比,您不会获得任何速度优势。事实上,它可能比使用普通的 Python 对象(例如元组列表)要慢。
出于这个原因,我建议尽可能避免将 Python 对象存储在 NumPy 数组中,尤其是当这些对象是数字时,因为 NumPy 的本机数字 dtype 服务得更好。
与其将 3 元组存储在数组中,不如在 NumPy 数组中添加一个额外的维度(所谓的“轴”)并沿该轴存储 3 个分量。
一旦你这样做了,你考虑的数值计算就是小菜一碟。可以通过以下方式完成:
x[:,2]-y[:,2]