我有一个以 NumPy 数组为元素的列表,如下所示:

[array([ 0.2, -2.3,  5.3]),
 array([-1.6, -1.7,  0.3]),
 array([ 2.4, -0.2, -3.0]),
 array([-4.1, -2.3, -2.7])]

我想将其转换为 3 个列表,每个列表包含来自上述列表列的元素。因此,期望的结果如下

list1 = [0.2, -1.6, 2.4, -4.1]
list2 = [-2.3, -1.7, -0.2, -2.3]
list3 = [5.3, 0.3, -3.0, -2.7]

1

  • 1
    结果真的需要是列表吗?元组可以吗?列表元素呢 – python 浮点数,或者可以np.float吗?在 numpy2 中,它们的显示不同。答案使用tolist()将更彻底地转换为 python 浮点数。


    – 


6 个回答
6

您可以使用如下方法实现此目的:

transposed = np.array(array_list).T
list1, list2, list3 = transposed.tolist()

1

  • 1
    我擅自修改了该链接(链接到T而不是transpose,因为T在代码片段中使用了 )。


    – 

您可以使用 zip

a = [
    np.array([0.2, -2.3, 5.3]),
    np.array([-1.6, -1.7, 0.3]),
    np.array([2.4, -0.2, -3.0]),
    np.array([-4.1, -2.3, -2.7])
]

使用以下一行中的列表 comp zip

list1,list2,list3 = [list(x) for x in zip(*a)]

2

  • 2
    可以简化为list1,list2,list3 = zip(*a)。右侧解包遍历zip。除非OP真的需要列表而不是元组。


    – 

  • @hpaulj 是的,绝对如此。Op 将获得 3 个元组。


    – 

你可以尝试

import numpy as np

a = [
    np.array([0.2, -2.3, 5.3]),
    np.array([-1.6, -1.7, 0.3]),
    np.array([2.4, -0.2, -3.0]),
    np.array([-4.1, -2.3, -2.7])
]

list1 = [arr[0] for arr in a]
list2 = [arr[1] for arr in a]
list3 = [arr[2] for arr in a]

# your result
print("list1:", list1)
print("list2:", list2)
print("list3:", list3)

假设您的数组列表定义如下:

import numpy as np

array_list = [np.array([ 0.2, -2.3,  5.3]),
              np.array([-1.6, -1.7,  0.3]),
              np.array([ 2.4, -0.2, -3.0]),
              np.array([-4.1, -2.3, -2.7])]

然后您可以使用以下一行代码:

list1, list2, list3 = np.transpose(array_list).tolist()

NumPy 的函数会隐式转换array_list为二维 NumPy 数组(因此无需显式执行此操作),然后再进行转置(即将行转换为列,将列转换为行)。调用结果数组会将其转换为列表的列表,最顶层有三​​个元素(对应于原始的三列)。将结果赋值给list1, list2, list3 = ...会将这个三元素列表“解包”到三个目标变量中。

如果您希望结果(list1,,list2list3再次为 NumPy 数组而不是列表,则可以省略tolist(),因此只需编写:

list1, list2, list3 = np.transpose(array_list)

您可以将列表堆叠到二维 numpy 数组中并进行转置。

import numpy as np


array_list = [np.array([0.2, -2.3, 5.3]),
              np.array([-1.6, -1.7, 0.3]),
              np.array([2.4, -0.2, -3.0]),
              np.array([-4.1, -2.3, -2.7])]


stacked_array = np.vstack(array_list).T


list1, list2, list3 = stacked_array[0].tolist(), stacked_array[1].tolist(), stacked_array[2].tolist()

print(list1) print(list2) print(list3)

将整个列表转换为 Python 2D 列表列表比实例化三个新变量更合适,无论如何你都可以这样做

original_list = [np.array([ 0.2, -2.3,  5.3]),
 np.array([-1.6, -1.7,  0.3]),
 np.array([ 2.4, -0.2, -3.0]),
 np.array([-4.1, -2.3, -2.7])]
 
list1 = [float(x[0]) for x in original_list]
list2 = [float(x[1]) for x in original_list]
list3 = [float(x[2]) for x in original_list]

或者,您可以将原始列表列表转换为 numpy 数组,然后转置并将其转换回列表。

result = np.array(original_list).transpose().tolist()

list1 = result[0]
list2 = result[1]
list3 = result[2]