【问题标题】:Combining two 1D arrays of different data types into 1 2D array in PYTHON在 PYTHON 中将两个不同数据类型的 1D 数组组合成 1 个 2D 数组
【发布时间】:2015-11-28 03:01:27
【问题描述】:

我有 2 个数字列表:a 和 b。 A 是整数类型的节点编号列表,b 是浮点64 类型的 X 坐标列表。我想将这 2 个等长数组 (N) 组合成一个保留数据类型的 Nx2 数组。我稍后在一些布尔测试中使用这个数组,所以我需要第一列是整数。我一直在使用:

nodeID = np.concatenate([[a],[b]]).T

但显然这会将所有内容都转换为浮点数。

谢谢!

【问题讨论】:

    标签: python arrays numpy types


    【解决方案1】:

    实现目标的一种方法是使用numpydtype,如http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html 中所述

    >>> import numpy as np
    >>> dt = np.dtype([('a', np.int64, 1), ('b', np.float64, 1)])
    >>> a = np.array([1,2,3,4], dtype=np.int64)
    >>> b = np.array([1.,2.,3.,4.], dtype=np.float64)
    >>> ab = np.array(zip(a,b), dtype=dt)
    >>> ab[:]['a']
    array([1, 2, 3, 4])
    >>> ab[:]['b']
    array([ 1.,  2.,  3.,  4.])
    

    【讨论】:

      【解决方案2】:

      您可以在此处使用 zip()。如果只是比较列表a的元素,那么这里有什么问题呢?

      a =[1,2,3,4]
      b =["Hello", "world", "fellow"]
      
      x=zip(a,b)
      print x
      
      for a,b in x:
        if a == someThing:
           doSomething()
      

      【讨论】:

      • z = [[x_item, y_item] for x_item, y_item in zip(x,y)]
      • 这可以保留数据类型,但我需要能够单独调用 a 和 b 列表。如何仅访问由 array = zip(a,b) 生成的数组第一行中的“a”中的信息?
      • 谢谢。我只检查 a 列,因为我将节点 #(整数)与元素 ID 矩阵(整数)匹配。我需要保持 X 坐标,以便知道元素的位置。理想情况下,我可以在 for 循环中使用 i 和 j 计数器分别索引 a 和 b 列。
      【解决方案3】:

      我假设因为您在标题中提到了一个 2D 列表,所以您想要一个类似于下面的列表,其中每个节点和坐标都保留了它们的类型:

      [[node1, coord1], [node2, coord2], ... ]
      

      您可以在没有任何模块的情况下用三行快速完成此操作,同时保留每个变量的类型:

      nodeID = []
      for i, node in enumerate(a):
          nodeID.append([node, b[i]])
      

      因此,您将拥有一个 2D 列表。 2D 列表中的每个元素本身将是另一个列表,其中包含一对节点和一个坐标。由于 Python 对类型不敏感,因此您的节点和坐标的类型都将被保留。您将通过以下方式访问每一对:

      pair1 = nodeID[0]
      pair2 = nodeID[1]
      pairx = nodeID[x]
      

      以及它们的内容:

      node1 = nodeID[0[0]]
      node2 = nodeID[1[0]]
      coord1 = nodeID[0[1]]
      coord2 = nodeID[1[1]]
      

      希望这会有所帮助。 :-)

      【讨论】:

      • 也很有帮助。谢谢!
      【解决方案4】:

      zip 函数是最简单的方法。简短的例子:

      >>> a = [1, 2, 3, 4, 5]
      >>> b = [1.1, 2.2, 3.3, 4.4, 5.5]
      >>> zip(a,b)
      [(1, 1.1), (2, 2.2), (3, 3.3), (4, 4.4), (5, 5.5)]
      >>> 
      

      如果你想从zip(a,b)得到a,只需写:

      >>> [x[0] for x in zip(a, b)]
      [1, 2, 3, 4, 5]
      

      一个好主意是从两个列表中制作字典:

      >>> keys = [1,2,3,4,5]
      >>> values = [1.1,2.2,3.3,4.4,5.5]
      >>> dictionary = dict(zip(keys, values))
      >>> dictionary
      {1: 1.1, 2: 2.2, 3: 3.3, 4: 4.4, 5: 5.5}
      

      但要小心,字典中的顺序并没有保存。从字典中获取数据非常简单:

      >>> dictionary.keys()
      [1, 2, 3, 4, 5]
      >>> dictionary.values()
      [1.1, 2.2, 3.3, 4.4, 5.5]
      >>> dictionary[1]
      1.1
      >>> 
      

      【讨论】:

        猜你喜欢
        • 2017-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 2022-01-04
        • 1970-01-01
        相关资源
        最近更新 更多