将具有不同长度的列表列表转换为numpy数组

Dim*_*sel 12 python arrays numpy

我有不同长度的列表列表(例如[[1, 2, 3], [4, 5], [6, 7, 8, 9]]),并希望将其转换numpy为整数数组.我知道numpy多维数组中的'sub' 数组必须是相同的长度.那么,什么是这样的列表转换为例如上文成最有效的方式numpy是这样排列[[1, 2, 3, 0], [4, 5, 0, 0], [6, 7, 8, 9]]的,即用零完成?

pla*_*360 13

你可以使用np.zeros创建一个numpy数组,并用列表元素填充它们,如下所示.

a = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
import numpy as np
b = np.zeros([len(a),len(max(a,key = lambda x: len(x)))])
for i,j in enumerate(a):
    b[i][0:len(j)] = j
Run Code Online (Sandbox Code Playgroud)

结果是

[[ 1.  2.  3.  0.]
 [ 4.  5.  0.  0.]
 [ 6.  7.  8.  9.]]
Run Code Online (Sandbox Code Playgroud)


hpa*_*ulj 13

这是一种@Divakar答案:

In [945]: ll = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
In [946]: lens = [len(l) for l in ll]      # only iteration
In [947]: lens
Out[947]: [3, 2, 4]
In [948]: maxlen=max(lens)
In [949]: arr = np.zeros((len(ll),maxlen),int)
In [950]: mask = np.arange(maxlen) < np.array(lens)[:,None] # key line
In [951]: mask
Out[951]: 
array([[ True,  True,  True, False],
       [ True,  True, False, False],
       [ True,  True,  True,  True]], dtype=bool)
In [952]: arr[mask] = np.concatenate(ll)    # fast 1d assignment
In [953]: arr
Out[953]: 
array([[1, 2, 3, 0],
       [4, 5, 0, 0],
       [6, 7, 8, 9]])
Run Code Online (Sandbox Code Playgroud)

对于大型列表,它有可能更快.但它更难理解和/或重新创建.

将Python序列转换为NumPy数组,填充缺失值 - Divakar有一篇好文章. itertools.zip_longest也提到了.这可以作为重复引用.

  • 这个答案比公认的答案好得多。谢谢! (2认同)

Mos*_*oye 8

通过填充较短的子列表,对列表进行一些预处理,然后再转换为numpy数组:

>>> lst = [[1, 2, 3], [4, 5], [1, 7, 8, 9]]
>>> pad = len(max(lst, key=len))
>>> np.array([i + [0]*(pad-len(i)) for i in lst])
array([[1, 2, 3, 0],
       [4, 5, 0, 0],
       [1, 7, 8, 9]])
Run Code Online (Sandbox Code Playgroud)

  • 我觉得这比公认的答案更pythonic ... (3认同)