将元组列表转换为numpy数组将产生一维结果

2024-06-12 00:50:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有一个元组列表,格式为(年,值):

splist

[(2002, 10.502535211267606),
 (2003, 10.214794520547946),
 (2004, 9.8115789473684227),
  ..
 (2015, 9.0936585365853659),
 (2016, 9.2442725379351387)]

其目的是将元组列表转换为二维numpy数组。但是,使用np.asarray的已发布答案保留一个单个维度:

dt = np.dtype('int,float')
spp = np.asarray(splist,dt)

spp
   array([(2002, 10.502535211267606), (2003, 10.214794520547946),
   (2004, 9.811578947368423), (2005, 9.684155844155844),
   ..
   (2014, 9.438987341772153), (2015, 9.093658536585366),
   (2016, 9.244272537935139)],
  dtype=[('f0', '<i8'), ('f1', '<f8')])

当查看输出的尺寸时,这一点变得很清楚:

In [155]: spp.shape
Out[155]: (15,)

我们想要什么:

   array([[(2002, 10.502535211267606)],
        [(2003, 10.214794520547946)],
   ..
   [(2014, 9.438987341772153)], 
   [(2015, 9.093658536585366)],
   [(2016, 9.244272537935139)]])

那么,将元组列表转换为二维数组有什么魔力呢?


Tags: 答案目的numpy列表格式npdt数组
2条回答

如果想要二维结果,只需使用^{},而不是asarray

>>> a = [(2002, 10.502535211267606),
...  (2003, 10.214794520547946),
...  (2004, 9.8115789473684227),
...  (2015, 9.0936585365853659),
...  (2016, 9.2442725379351387)]
>>> np.array(a)    
array([[ 2002.        ,    10.50253521],
       [ 2003.        ,    10.21479452],
       [ 2004.        ,     9.81157895],
       [ 2015.        ,     9.09365854],
       [ 2016.        ,     9.24427254]])
>>> np.array(a).shape
(5, 2)

注意,这将使两个列都成为浮点数据类型。不可能在每个列中都有具有不同数据类型的2D numpy数组。如果你想这么做,我认为熊猫有一个办法:尽管我对熊猫没有任何经验。

使用numpy唯一能做的就是拥有一个1D数组的“object”类型,每个元素都是一个元组——但这就是使用asarray所能做的。

如果我正确理解您所需的输出,您可以使用^{}

>>> spp = np.asarray(splist, dt)
>>> spp
array([(2002, 10.502535211267606),
       (2003, 10.214794520547946),
       (2004, 9.811578947368423),
       (2015, 9.093658536585366),
       (2016, 9.244272537935139)], 
      dtype=[('f0', '<i4'), ('f1', '<f8')])

>>> np.reshape(spp, (spp.size, 1))
array([[(2002, 10.502535211267606)],
       [(2003, 10.214794520547946)],
       [(2004, 9.811578947368423)],
       [(2015, 9.093658536585366)],
       [(2016, 9.244272537935139)]], 
      dtype=[('f0', '<i4'), ('f1', '<f8')])

相关问题 更多 >