Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Python-元组列表中的减法元素_List_Python 3.x_Numpy - Fatal编程技术网

List Python-元组列表中的减法元素

List Python-元组列表中的减法元素,list,python-3.x,numpy,List,Python 3.x,Numpy,我有两个元组列表 x = [(A1, B1, C1), (A2, B2, C2),...(AN, BN, CN)] 及 我想做以下几件事: 获取一个新列表[(A1、B1、C1-C1)-(A2、B2、C2- (安,BN,CN-CN) 从那里,创建一个列表 仅由[C1-C1_u3;,C2-C2_3;,…]组成 我想冒昧地说,Numpy中的某些东西允许我这样做,但我仍然没有找到如何只对元组中的一个元素执行操作的方法,因此我将感谢任何可能的帮助。 谢谢。如果以元组列表的x和y开头,则很容易将它们转换为

我有两个元组列表

x = [(A1, B1, C1), (A2, B2, C2),...(AN, BN, CN)]

我想做以下几件事:

  • 获取一个新列表<代码>[(A1、B1、C1-C1)-(A2、B2、C2- (安,BN,CN-CN)
  • 从那里,创建一个列表 仅由[C1-C1_u3;,C2-C2_3;,…]组成
  • 我想冒昧地说,Numpy中的某些东西允许我这样做,但我仍然没有找到如何只对元组中的一个元素执行操作的方法,因此我将感谢任何可能的帮助。
    谢谢。

    如果以元组列表的
    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函数的调用,而不是NumPy通常调用的更快的C/Fortran编译函数

    因此,虽然您可能喜欢NumPy语法来选择数组中的项,但与普通Python对象相比,您并没有获得任何速度优势。事实上,它可能比使用普通Python对象(例如元组列表)慢

    出于这个原因,我建议尽可能避免将Python对象存储在NumPy数组中,尤其是当这些对象是数字对象时,因为NumPy的本机数字数据类型服务得更好

    与其在数组中存储3元组,不如在NumPy数组中添加一个额外的维度(所谓的“轴”),并沿该轴存储3个组件

    一旦你这样做了,你所考虑的数值计算就是小菜一碟。可以通过以下方式完成:

    x[:,2]-y[:,2]
    
    没有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]
    

    学习如何使用和函数。你没有列表列表,只有元组列表。
    >>> 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]