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

从列表的numpy数组创建列表的最快方法,numpy,numpy-ndarray,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]), lis

我有一系列的清单。这是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 ]

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

使用
m.tolist()
而不是
m
可以获得相当大的加速。如需其他次要保存,请使用
zip

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

您的示例是列表对象的一维数组,因此在轴1上作为
m[:,0]
直接切片将失败,因为它没有轴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]

我试过了。它与numpy.array类型一起工作,但与numpy.ndarray类型一起出现错误。索引器:数组的索引太多。我完全复制您发布的列表,创建了一个ndarray
m
m
的类型为ndarray。所有numpy阵列都存储为NDARRAY。所以这个索引应该适用于任何二维数组。我可以编辑我的答案以包含构造代码?我手动创建了这个数组,它可以像您提到的那样工作。出于某种原因,当我从从panda dataframe转换而来的更大的numpy矩阵中提取此数组时,我遇到了一个错误。您无法通过复制和粘贴来重新创建1d对象dtype数组。我如何才能创建每个列表中第二个元素的列表?@afshin对于此,您的列表理解适用于
m.tolist()
很难打败。我确实需要它作为numpy数组返回,所以我尝试了n=np.vstack(m[:,0]它比我的列表理解速度慢。numpy数组提供了在整个轴上切片元素的简单方便的方法。但是,在混合对象类型上,将这些子列表转换为numpy数组需要花费时间。如果时间很关键,我认为在这种情况下最好的解决方案是列表理解,正如您所说。使用numpy的另一个解决方案是
np.array(m.tolist())[:,1]
。此解决方案比
np.vstack
快,但仍然比数据的列表理解慢