【发布时间】:2020-12-31 21:48:06
【问题描述】:
我有一个这样的列表:
lista=[[1,2,3],
[1,2,3,4,5,6],
[1,2],]
我想得到这样的 numpy.array,(较短的列表元素扩展为最大长度,然后将尾部值设置为零):
array([[1,2,3,0,0,0],
[1,2,3,4,5,6],
[1,2,0,0,0,0],])
怎么办? numpy中有哪些内置方法?
【问题讨论】:
我有一个这样的列表:
lista=[[1,2,3],
[1,2,3,4,5,6],
[1,2],]
我想得到这样的 numpy.array,(较短的列表元素扩展为最大长度,然后将尾部值设置为零):
array([[1,2,3,0,0,0],
[1,2,3,4,5,6],
[1,2,0,0,0,0],])
怎么办? numpy中有哪些内置方法?
【问题讨论】:
如何创建一个 zeros numpy 数组,然后相应地填充值?
lists = [[1,2,3],
[1,2,3,4,5,6],
[1,2]]
a = np.zeros([len(lists), max([len(x) for x in lists])])
for i, sub in enumerate(lists):
a[i][0:len(sub)] = sub
【讨论】:
没有直接使用 numpy 的方法,因为每个内部列表都有不同数量的元素。一种方法是使用itertools.zip_longest 和fillvalue:
from itertools import zip_longest
np.array(list(zip_longest(*lista, fillvalue=0))).T
array([[1, 2, 3, 0, 0, 0],
[1, 2, 3, 4, 5, 6],
[1, 2, 0, 0, 0, 0]])
【讨论】:
np.fromiter 对其进行优化(大型列表为 25%)。 np.array(list(<iterator>)) 通常不是最快的选择。
dt = np.dtype([('', np.int)]*M) #or np.dtype(','.join('i'*M)); indices = np.fromiter(zip_longest(*lists, fillvalue=0), dt); indices = indices.view(np.int).reshape(-1, M).T 其中M 是行的长度(查看 Robo 的答案)。