从numpy列表数组创建列表的最快方法

时间:2019-12-22 15:45:48

标签: numpy numpy-ndarray

我有一些列表的数组。这是numpy.ndarray类型:

   array([list([2692, 2711]), list([2751, 2770]), list([3455, 3462]),
   list([4020, 4027]), list([7707, 7726]), list([7893, 7912]),
   list([8118, 8126]), list([8174, 8179]), list([8215, 8234]),
   list([9227, 9246]), list([9518, 9537]), list([9839, 9859]),
   list([10002, 10021]), list([10024, 10043]), list([10158, 10178]),
   list([11346, 11365])], dtype=object)

我想从每个子列表的第一个元素创建一个列表。我通过列表理解来做到这一点:

 lst = [ x[1] for x in m ]

有没有更快的方法来创建此列表?

3 个答案:

答案 0 :(得分:1)

>>> m[:, 0]
array([2692, 2751, 3455, 4020, 7707, 7893, 8118, 8174, 8215, 9227, 9518,
       9839, 10002, 10024, 10158, 11346], dtype=object)

答案 1 :(得分:1)

使用m.tolist()而不是m可以大大提高速度。要进行其他次要节省,请使用zip

[*zip(*m.tolist()).__next__()]
# [2692, 2751, 3455, 4020, 7707, 7893, 8118, 8174, 8215, 9227, 9518, 9839, 10002, 10024, 10158, 11346]

答案 2 :(得分:0)

您的样本是列表对象的一维数组,因此直接分割为m[:, 0]的轴1将会失败,因为它没有轴1。如果每个子列表的长度都不同,那么我认为比列表理解更好的解决方案。但是,如果每个子列表的长度相同(如您的示例中每个子列表的长度为2),则可以使用np.vstack将其转换为二维数组和切片,如下所示:

n = np.vstack(m)[:,0].tolist()

Out[371]:
[2692,
 2751,
 3455,
 4020,
 7707,
 7893,
 8118,
 8174,
 8215,
 9227,
 9518,
 9839,
 10002,
 10024,
 10158,
 11346]