将不同大小数组的数组转换为 numpy 数组
Convert array of varying sized arrays to numpy array
我正在处理一个根文件(数组的数组)。当我将数组加载到 python 时,我得到一个笨拙的数组,因为这是一个大小不一的数组。我想学习如何通过用 NaN 填充空元素将其转换为相同大小的 numpy 数组。如何将大小不一的笨拙数组转换为 numpy 数组?
您可以使用此代码并相应地实现它:
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]
假设您有一个可变长度列表数组 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. But first, we need a size to pad it to. We can get the length of each list with ak.num and then take the 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]])
我正在处理一个根文件(数组的数组)。当我将数组加载到 python 时,我得到一个笨拙的数组,因为这是一个大小不一的数组。我想学习如何通过用 NaN 填充空元素将其转换为相同大小的 numpy 数组。如何将大小不一的笨拙数组转换为 numpy 数组?
您可以使用此代码并相应地实现它:
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]
假设您有一个可变长度列表数组 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. But first, we need a size to pad it to. We can get the length of each list with ak.num and then take the 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]])