Python 将具有不同大小行的数据加载到Numpy数组中
假设我有一个包含如下数据的文本文件:Python 将具有不同大小行的数据加载到Numpy数组中,python,numpy,Python,Numpy,假设我有一个包含如下数据的文本文件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 如何将其加载到numpy数组中,使其看起来像这样 [1 2 3 4 5 0 6 7 8 0 0 0 9 10 11 12 13 14 15 16 17 18 19 0 ] 到目前为止,我一直使用的方法包括逐行读取文本文件,将每一行追加到列表中,找到最大长度的行,并相应地填充其余行 有人能提出一个更有效的方法吗 多谢各
1 2 3 4 5
6 7 8
9 10 11 12 13 14
15 16 17 18 19
如何将其加载到numpy数组中,使其看起来像这样
[1 2 3 4 5 0
6 7 8 0 0 0
9 10 11 12 13 14
15 16 17 18 19 0 ]
到目前为止,我一直使用的方法包括逐行读取文本文件,将每一行追加到列表中,找到最大长度的行,并相应地填充其余行
有人能提出一个更有效的方法吗
多谢各位 填充列表列表可以通过多种方式完成,但由于您已经从文件中读取了此内容,我认为
itertools.zip\u longest
将是一个良好的开端
In [201]: txt = """1 2 3 4 5
...: 6 7 8
...: 9 10 11 12 13 14
...: 15 16 17 18 19"""
阅读并分析文本行:
In [202]: alist = []
In [203]: for line in txt.splitlines():
...: alist.append([int(i) for i in line.split()])
...:
In [204]: alist
Out[204]: [[1, 2, 3, 4, 5], [6, 7, 8], [9, 10, 11, 12, 13, 14], [15, 16, 17, 18, 19]]
zip_longest
(此处为PY3格式)采用填充值:
In [205]: from itertools import zip_longest
In [206]: list(zip_longest(*alist, fillvalue=0))
Out[206]:
[(1, 6, 9, 15),
(2, 7, 10, 16),
(3, 8, 11, 17),
(4, 0, 12, 18),
(5, 0, 13, 19),
(0, 0, 14, 0)]
In [207]: np.array(_).T
Out[207]:
array([[ 1, 2, 3, 4, 5, 0],
[ 6, 7, 8, 0, 0, 0],
[ 9, 10, 11, 12, 13, 14],
[15, 16, 17, 18, 19, 0]])
zip(*)
也可用于“转置”列表:
In [209]: list(zip(*alist1))
Out[209]:
[(1, 2, 3, 4, 5, 0),
(6, 7, 8, 0, 0, 0),
(9, 10, 11, 12, 13, 14),
(15, 16, 17, 18, 19, 0)]
我猜你正在做的事情更像:
In [211]: maxlen = max([len(i) for i in alist])
In [212]: maxlen
Out[212]: 6
In [213]: arr = np.zeros((len(alist), maxlen),int)
In [214]: for row, line in zip(arr, alist):
...: row[:len(line)] = line
...:
In [215]: arr
Out[215]:
array([[ 1, 2, 3, 4, 5, 0],
[ 6, 7, 8, 0, 0, 0],
[ 9, 10, 11, 12, 13, 14],
[15, 16, 17, 18, 19, 0]])
这对我来说很好
普通的海报Divakar喜欢发布使用cumsum
的解决方案。让我们看看我是否能复制它。它涉及到构造一个一维掩模,其中非零值应该去。反向工作时,我们需要一个面具,如:
In [240]: mask=arr.ravel()>0
In [241]: mask
Out[241]:
array([ True, True, True, True, True, False, True, True, True,
False, False, False, True, True, True, True, True, True,
True, True, True, True, True, False], dtype=bool)
以便:
In [242]: arr.flat[mask] = np.hstack(alist)
这个映射有一个技巧我还没有完全内化
诀窍是广播长度与
[0,1,2,3,4,5]
:
In [276]: lens=[len(i) for i in alist]
In [277]: maxlen=max(lens)
In [278]: mask=np.array(lens)[:,None]>np.arange(maxlen)
In [279]: mask
Out[279]:
array([[ True, True, True, True, True, False],
[ True, True, True, False, False, False],
[ True, True, True, True, True, True],
[ True, True, True, True, True, False]], dtype=bool)
In [280]: arr = np.zeros((len(alist), maxlen),int)
In [281]: arr[mask] = np.hstack(alist)
In [282]: arr
Out[282]:
array([[ 1, 2, 3, 4, 5, 0],
[ 6, 7, 8, 0, 0, 0],
[ 9, 10, 11, 12, 13, 14],
[15, 16, 17, 18, 19, 0]])
这成功了!非常感谢你回答我的问题!我不知道itertools有zip_最长的功能!你是对的,我在做与你提到的类似的事情。我很高兴学到新东西!