【问题标题】:Create new column in Python array based on values calculated in the code根据代码中计算的值在 Python 数组中创建新列
【发布时间】:2015-07-17 17:27:13
【问题描述】:

目前我有一个格式如下的数组:arr = [(1,1),(1,1)...(35,1),(35,1)])

我编写了一个代码,它为数组中的每个有序对计算第三个值,一次一个。如何创建一个新列,将每个计算值作为新列存储在我的数组中?

【问题讨论】:

  • arr 是 NumPy 数组吗?还是 Python 列表?换句话说,type(arr) 返回什么?
  • 我已经看过了,但我不确定它是否适用于我的代码中计算的值。
  • 只需使用您的计算值创建一个数组。然后将两个数组连接在一起。确保使用正确的轴进行连接。

标签: python arrays numpy add arcpy


【解决方案1】:

元组是不可变的,所以你不能直接改变它们。幸运的是,您可以将另一个元组连接到它们。假设你有一个数组:

arr = [(1, 2), (3, 4), (5, 6)]

并且您想为每个元组附加一些整数,为了简单起见,假设arr 中的元组索引。也就是说,您希望最终列表为:

arr = [(1, 2, 0), (3, 4, 1), (5, 6, 2)]

下面的代码可以做到这一点:

arr = [item + (a.index(item),) for item in arr]

请注意,(a.index(item),) 中的逗号和括号对于形成元组而不是整数至关重要。 (您只能将元组连接到其他元组。)因此,如果您只想将数字添加到特定元组,请尝试:

arr[0] += (3,)

这会将3 附加到arr 中第一个元素的末尾。这将允许您在生成第三个点的任何循环中执行这种连接,您说这一次发生一个。编码愉快!

【讨论】:

    【解决方案2】:

    替代解决方案,只需随时替换元组即可。

    for i in range(len(arr)):
        arr[i] = (arr[i][0], arr[i][1], arr[i][0] * arr[i][1])
    

    【讨论】:

      【解决方案3】:

      Array formated as arr = [(1,1),(1,1)...(35,1),(35,1)] 可能会造成混淆。它看起来像是 tupleslist。如果是这样的话,您需要使用列表推导来创建一个新列表:

      arr1 = [(i,j, fun(i,j)) for i,j in arr]
      

      例如

      In [359]: arr=[(1,1),(1,2),(35,1),(35,2)]
      In [360]: [(i[0],i[1], sum(i)) for i  in arr]
      Out[360]: [(1, 1, 2), (1, 2, 3), (35, 1, 36), (35, 2, 37)]
      

      但你在评论中说arr 是一个 numpy 数组。

      In [361]: Arr=np.array(arr)    
      In [362]: Arr
      Out[362]: 
      array([[ 1,  1],
             [ 1,  2],
             [35,  1],
             [35,  2]])
      

      相同的数字,但显示为列表列表。显示为元组列表的数组是结构化数组,具有不同的dtype

      该函数是否可以获取整个数组,还是必须将值 2 乘 2 提供?

      np.sum 获取整个数组,并可以返回二维结果:

      In [366]: np.sum(Arr, axis=1, keepdims=True)
      Out[366]: 
      array([[ 2],
             [ 3],
             [36],
             [37]])
      

      它可以很容易地连接到Arr,从而提供一个新数组:

      In [370]: np.concatenate([Arr,np.sum(Arr, axis=1, keepdims=True)],axis=1)
      Out[370]: 
      array([[ 1,  1,  2],
             [ 1,  2,  3],
             [35,  1, 36],
             [35,  2, 37]])
      

      另一方面,Python sum 只接受数字。 Arr 可以像列表一样用于推导式:

      In [371]: [sum(i) for i  in Arr]
      Out[371]: [2, 3, 36, 37]
      

      要将其连接到原始数据上,我需要将其转换为二维“垂直”数组(如 Out[366] 所示)

      In [376]: np.concatenate([Arr,np.array([sum(i) for i in Arr])[:,None]],axis=1)
      Out[376]: 
      array([[ 1,  1,  2],
             [ 1,  2,  3],
             [35,  1, 36],
             [35,  2, 37]])
      

      appendvstackhstack 都是 concatenate 的变体。您还可以构造一个(4,3) 数组,并插入Arr 的值和新的计算。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        • 2021-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-02
        相关资源
        最近更新 更多