将元组列表的列表转换为二维Numpy数组

6

我有一个元组的列表的列表:

X = [[(0.5, 0.5, 0.5), (1.0, 1.0, 1.0)], [(0.5, 0.5, 0.52), (1.0, 1.0, 1.0)], [(0.5, 0.52, 0.52), (1.0, 1.0, 1.0)], [(0.52, 0.52, 0.52), (1.0, 1.0, 1.0)], [(0.52, 0.52, 0.52), (1.0, 1.0, 1.0)]]

我想把它转换成2D numpy数组。我尝试了以下方法,但没有起作用。我只想确保新的转换后的2D数组保持与X相同的形状和结构。请帮助我,非常感谢。

import numpy as np
X = [[(0.5, 0.5, 0.5), (1.0, 1.0, 1.0)], [(0.5, 0.5, 0.52), (1.0, 1.0, 1.0)], [(0.5, 0.52, 0.52), (1.0, 1.0, 1.0)], [(0.52, 0.52, 0.52), (1.0, 1.0, 1.0)], [(0.52, 0.52, 0.52), (1.0, 1.0, 1.0)]]
np.asarray([sublist for sublist in X])

期望的结果应该是:
[[ 0.5 ,  0.5 ,  0.5 ],
    [ 1.  ,  1.  ,  1.  ]],

   [[ 0.5 ,  0.5 ,  0.52],
    [ 1.  ,  1.  ,  1.  ]],

   [[ 0.5 ,  0.52,  0.52],
    [ 1.  ,  1.  ,  1.  ]],

   [[ 0.52,  0.52,  0.52],
    [ 1.  ,  1.  ,  1.  ]],

   [[ 0.52,  0.52,  0.52],
    [ 1.  ,  1.  ,  1.  ]]

2
你的数据无法直接转换为2D数组。请问你期望得到什么结果? - Mazdak
1
“它没有工作”不是一个问题描述。 - timgeb
X 的当前结构适合形状为 (5,2,3) 的数组。然后有许多方法可以将其转换为二维数组,因此请指定您期望的结果。 - Angus Williams
1
5个数组。要拥有一个数组,您应该在数组的开头有一个起始括号,并在数组定义的末尾有一个匹配的结束括号。您应该了解多维数组是如何存储的。 - Divakar
我遇到了相同的问题,使用np.genfromtxt加载后。我想将其转换为数字的二维数组,而不是元组的一维数组。 - mhstnsc
显示剩余2条评论
2个回答

7

不知道您是否在使用Python 2.x或3.x,但是在3.x中,您可以尝试以下方法:

>> import numpy as np
>> X = [(....)] # Your list
>> array = np.array([*X])
>> print(array)
array([[[ 0.5 ,  0.5 ,  0.5 ],
    [ 1.  ,  1.  ,  1.  ]],

   [[ 0.5 ,  0.5 ,  0.52],
    [ 1.  ,  1.  ,  1.  ]],

   [[ 0.5 ,  0.52,  0.52],
    [ 1.  ,  1.  ,  1.  ]],

   [[ 0.52,  0.52,  0.52],
    [ 1.  ,  1.  ,  1.  ]],

   [[ 0.52,  0.52,  0.52],
    [ 1.  ,  1.  ,  1.  ]]])

不确定这是否是您想要实现的目标。

1
请参考我的输入,不要忽略它。另外,期望的输出应该是二维数组,而不是三维数组,这正是我提出问题的关键所在!!! - aBiologist
1
首先:第二行有一条注释,请阅读它。 其次:当你的结果是5个2D数组时,你如何期望得到一个2D数组呢?如果你只想要五个2D数组,那么可以使用以下代码: arrays = [np.asarray(sublist) for sublist in X] - Nf4r

2
如果我按照正常方式对您的列表进行操作,将得到一个三维数组:
In [38]: np.array(X)
Out[38]: 
array([[[ 0.5 ,  0.5 ,  0.5 ],
        [ 1.  ,  1.  ,  1.  ]],

       [[ 0.5 ,  0.5 ,  0.52],
        [ 1.  ,  1.  ,  1.  ]],

       [[ 0.5 ,  0.52,  0.52],
        [ 1.  ,  1.  ,  1.  ]],

       [[ 0.52,  0.52,  0.52],
        [ 1.  ,  1.  ,  1.  ]],

       [[ 0.52,  0.52,  0.52],
        [ 1.  ,  1.  ,  1.  ]]])
In [39]: _.shape
Out[39]: (5, 2, 3)

“print”(str)显示看起来很像您想要的结果——除了多出一组[]来包含整个内容:
In [40]: print(__)
[[[ 0.5   0.5   0.5 ]
  [ 1.    1.    1.  ]]

 [[ 0.5   0.5   0.52]
  [ 1.    1.    1.  ]]

 [[ 0.5   0.52  0.52]
  [ 1.    1.    1.  ]]

 [[ 0.52  0.52  0.52]
  [ 1.    1.    1.  ]]

 [[ 0.52  0.52  0.52]
  [ 1.    1.    1.  ]]]

我可以将它分成5个2D数组的列表,但显示方式会有所不同:
In [43]: np.split(np.array(X),5)
Out[43]: 
[array([[[ 0.5,  0.5,  0.5],
         [ 1. ,  1. ,  1. ]]]), array([[[ 0.5 ,  0.5 ,  0.52],
         [ 1.  ,  1.  ,  1.  ]]]), array([[[ 0.5 ,  0.52,  0.52],
        ...]

一个列表推导式将每个子列表转换为一个数组,执行相同的操作,[np.array(x) for x in X]

我也可以将 (5,2,3) 数组重塑为二维数组,例如 (10,3) 或 (5,6),但它们看起来不像你的目标。

元组层是否重要(与列表不同)?我可以使用结构化数组来保留它(外观上):np.array(X, dtype=('f,f,f'))


今天我学到了,在交互式命令行中,可以使用_____来访问倒数第二个和倒数第三个返回值。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接