【问题标题】:Convert array of varying sized arrays to numpy array将不同大小数组的数组转换为 numpy 数组
【发布时间】:2021-11-04 20:01:13
【问题描述】:

我正在处理一个根文件(数组数组)。当我将数组加载到 python 中时,我得到了一个尴尬的数组,因为这是一个不同大小的数组。我想学习如何通过用 NaN 填充空元素来将其转换为相同大小的数组的 numpy 数组。如何将不同大小的尴尬数组转换为 numpy 数组?

【问题讨论】:

  • 你能展示一些你的输入和你想要的输出的例子吗?
  • 有多种“填充”数组的方式。但是,如果您让我们了解数组形状(和 dtype),它会有所帮助。 np.nan 是一个浮点数。填充一堆 1d 数组将不同于 2d 或更多。搜索“[numpy] padding”应该会找到很多这样的答案

标签: python numpy root awkward-array


【解决方案1】:

您可以使用此代码并相应地实现它:

a = [1,2,3,4,5]
b = [1,2,3]
c = max(len(a),len(b))

for i in range(len(a),c):
   a.append(None)
for i in range(len(b),c):
   b.append(None)

结果如下:

a = [1, 2, 3, 4, 5] 
b = [1, 2, 3, None, None]

【讨论】:

    【解决方案2】:

    假设您有一个可变长度列表数组a

    >>> import numpy as np
    >>> import awkward as ak
    >>> a = ak.Array([[0, 1, 2], [], [3, 4], [5], [6, 7, 8, 9]])
    >>> a
    <Array [[0, 1, 2], [], ... [5], [6, 7, 8, 9]] type='5 * var * int64'>
    

    使所有列表具有相同大小的函数是ak.pad_none。但首先,我们需要一个尺寸来填充它。我们可以用ak.num得到每个列表的长度,然后取其中的np.max

    >>> ak.num(a)
    <Array [3, 0, 2, 1, 4] type='5 * int64'>
    >>> desired_length = np.max(ak.num(a))
    >>> desired_length
    4
    

    现在我们可以填充它并将其转换为 NumPy 数组(因为它现在具有矩形形状)。

    >>> ak.pad_none(a, desired_length)
    <Array [[0, 1, 2, None], ... [6, 7, 8, 9]] type='5 * var * ?int64'>
    >>> ak.to_numpy(ak.pad_none(a, desired_length))
    masked_array(
      data=[[0, 1, 2, --],
            [--, --, --, --],
            [3, 4, --, --],
            [5, --, --, --],
            [6, 7, 8, 9]],
      mask=[[False, False, False,  True],
            [ True,  True,  True,  True],
            [False, False,  True,  True],
            [False,  True,  True,  True],
            [False, False, False, False]],
      fill_value=999999)
    

    缺失值 (None) 被转换为 NumPy 掩码数组。如果你想要一个普通的 NumPy 数组,你可以ak.fill_none 给它们一个替换值。

    >>> ak.to_numpy(ak.fill_none(ak.pad_none(a, desired_length), 999))
    array([[  0,   1,   2, 999],
           [999, 999, 999, 999],
           [  3,   4, 999, 999],
           [  5, 999, 999, 999],
           [  6,   7,   8,   9]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 2018-02-26
      • 2016-12-31
      • 2018-07-15
      • 1970-01-01
      • 2021-12-29
      • 2017-03-08
      相关资源
      最近更新 更多