将列表列表转换为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)]

有办法做到这一点吗。这两天我一直在试着做这个。

由于您希望将每两个元素分组为一个元组,然后将每个元组的第一个元素转换为numpy数组,因此可以使用zip的列表理解:

[(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)]

您可以制作一个结构化数组:

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)

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

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

如果你不想写单独的行,你也可以循环浏览并找到"列表",然后转换它们。

最新更新