将列表转换为Numpy数组,但不保留列表

时间:2018-07-27 19:52:08

标签: python arrays numpy

我正在尝试将列表列表以及列表中的其他一些数字转换为numpy数组。

到目前为止,我已经尝试过了,但是列表仍然保留到数组中:

ll = [['119', '222', '219', '293'], '4', ['179', '124', '500', '235'], '7']
arrays = np.array(ll)

输出为:

array([list(['119', '222', '219', '293']), '4', list(['179', '124', '500', '235']), '7'], dtype=object)

我想要的输出是这样的:

[(array([ 119, 222, 219, 293]), 4), (array([ 179,  124, 500, 235]), 7)]

有没有办法做到这一点。最近两天,我一直在努力做到这一点。

3 个答案:

答案 0 :(得分:3)

由于您要将每两个元素分组为一个元组,然后将每个元组的第一个元素转换为一个numpy数组,因此可以对 zip 使用列表推导:< / p>

[(np.array(i, dtype=int), int(j)) for i, j in zip(ll[::2], ll[1::2])]

# Result
[(array([119, 222, 219, 293]), 4), (array([179, 124, 500, 235]), 7)]

请注意,我在numpy数组构造函数中指定了 dtype ,将数组转换为整数。

如果您担心要在此处制作列表的两个副本,则还可以简单地使用基于范围的索引:

[(np.array(ll[i], dtype=int), int(ll[i+1])) for i in range(0, len(ll), 2)]

答案 1 :(得分:2)

您可以创建一个结构化数组:

In [96]: ll = [['119', '222', '219', '293'], '4', ['179', '124', '500', '235'], '7']

In [97]: dt = np.dtype('4i,i')

In [98]: arr = np.zeros(2, dtype=dt)

In [99]: arr
Out[99]: 
array([([0, 0, 0, 0], 0), ([0, 0, 0, 0], 0)],
      dtype=[('f0', '<i4', (4,)), ('f1', '<i4')])

In [100]: arr['f0']=ll[::2]

In [101]: arr['f1']=ll[1::2]

In [102]: arr
Out[102]: 
array([([119, 222, 219, 293], 4), ([179, 124, 500, 235], 7)],
      dtype=[('f0', '<i4', (4,)), ('f1', '<i4')])

并提取到列表中

In [103]: arr.tolist()
Out[103]: 
[(array([119, 222, 219, 293], dtype=int32), 4),
 (array([179, 124, 500, 235], dtype=int32), 7)]

或2x2对象dtype数组:

In [104]: np.array(arr.tolist(),dtype=object)
Out[104]: 
array([[array([119, 222, 219, 293], dtype=int32), 4],
       [array([179, 124, 500, 235], dtype=int32), 7]], dtype=object)

In [105]: _.shape
Out[105]: (2, 2)

答案 2 :(得分:1)

您似乎希望单个元素是numpy数组,而不是整个数组。因此,您必须直接分配这些特定元素:

ll[0][0] = np.array(ll[0][0])
ll[0][2] = np.array(ll[0][2])

如果您不想编写单独的行,也可以遍历并找到“列表”,然后将其转换。