Python 将元组列表转换为numpy数组将导致一维

Python 将元组列表转换为numpy数组将导致一维,python,arrays,numpy,Python,Arrays,Numpy,我们有一个元组列表,格式为(年,值): 其目的是将元组列表转换为二维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.6841558441558

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

其目的是将元组列表转换为二维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')])
我们想要的是:


那么,将元组列表转换为二维数组有什么神奇之处呢?

如果您想要二维结果,只需使用,而不是
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可以做的唯一一件事就是拥有一个“object”类型的1D数组,每个元素都是一个元组——但这是使用
asarray

已经具备的功能,如果我正确理解了所需的输出,您可以使用

spp=np.asarray(splist,dt) >>>spp 阵列([(2002年,10.50253511267606), (2003, 10.214794520547946), (2004, 9.811578947368423), (2015, 9.093658536585366), (2016, 9.244272537935139)],
dtype=[('f0',预期的
数组([(2002,10.50253511267606)],..
看起来不像
2D
one。@Divakar在前后添加了额外的大括号。它本身看起来仍然不像2D数组。它有两个维度,但所有数据仍然只沿着第0维度。也就是说,您描述的形状是
(15,1)
@Praveen不确定你是如何得出这个结论的:它现在是一个正确的2D数组。它以前不是。这不是一个元组列表问题。问题是如何将(15,)数组重塑为(15,1)数组。没有
dt
你会得到一个(15,2)浮点数组。
np.array
甚至是在
asarray
之前尝试的第一件事。不确定为什么对我不起作用。它似乎起作用了。我不知道是什么操作序列使它以前对我不起作用。啊!我现在知道了。我使用了
scala
类似
类型别名
,如下:
npa=numpy.array
。它在某些情况下起作用,但在本例中做了错误的事情:执行
spp=npa(splist)
最终得到的是15x1,而不是
spp=np.array(splist)的15x2
gives.@wwii First:在接受之前需要等待一段时间:它仍然在最小窗口内。请注意,我已经对这两个选项进行了投票,因为它们都很有用。第二:有两个正确答案。我必须选择一个,然后选择另一个,因为其中的数据类型是正确的。
asarray
没有区别.重要的是
dt
数据类型。
In [155]: spp.shape
Out[155]: (15,)
   array([[(2002, 10.502535211267606)],
        [(2003, 10.214794520547946)],
   ..
   [(2014, 9.438987341772153)], 
   [(2015, 9.093658536585366)],
   [(2016, 9.244272537935139)]])
>>> 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)
>>> 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')])