Python - 将数组列表转换为2D数组

use*_*080 10 python arrays numpy

我有一个格式如下的数据集:

A=[(Num1,Num2,Num3), (Num4,Num5,Num6), (Num7,Num8,Num9)]
Run Code Online (Sandbox Code Playgroud)

A.shape = (3,)
Run Code Online (Sandbox Code Playgroud)

我想将其转换为2D numpy数组:

A=[[Num1,Num2,Num3],[Num4,Num5,Num6],[Num7,Num8,Num9]]
Run Code Online (Sandbox Code Playgroud)

A.shape = (3,3)
Run Code Online (Sandbox Code Playgroud)

我该怎么做,最好没有循环?谢谢.

YS-*_*S-L 10

不确定我是否正确理解了这个问题,但这对你有用吗?

import numpy as np
A = [[1,2,3],[4,5,6],[7,8,9]]
A = np.array(A)
Run Code Online (Sandbox Code Playgroud)

如果A是numpy数组的列表,那怎么样:

Ah = np.vstack(A)
Av = np.hstack(A)
Run Code Online (Sandbox Code Playgroud)


Ser*_*kiy 5

如果我正确理解了您的要求,则可能是numpy没有将数组数组转换为2d数组的情况。当您的数组大小不同时,可能会发生这种情况。例:

自动转换为二维数组:

import numpy as np
a = np.array([np.array([1,2,3]),np.array([2,3,4]),np.array([6,7,8])])
print a
Run Code Online (Sandbox Code Playgroud)

输出:

>>>[[1 2 3]
    [2 3 4]
    [6 7 8]]
Run Code Online (Sandbox Code Playgroud)

没有自动转换(在第二个子数组中查找更改):

import numpy as np
b = np.array([np.array([1,2,3]),np.array([2,3,4,5]),np.array([6,7,8])])
print b
Run Code Online (Sandbox Code Playgroud)

输出:

>>>[array([1, 2, 3]) array([2, 3, 4, 5]) array([6, 7, 8])]
Run Code Online (Sandbox Code Playgroud)

我发现了将数组数组转换为2d数组的几种方法。无论如何,您都需要去除大小不同的子数组。因此,您将需要一个遮罩以仅选择“好”子阵列。然后,可以将此掩码与列表推导一起使用来重新创建数组,如下所示:

import numpy as np

a = np.array([np.array([1,2,3]),np.array([2,3,4,5]),np.array([6,7,8])])
mask = np.array([True, False, True])

c = np.array([element for (i,element) in enumerate(a) if mask[i]])

print a
print c
Run Code Online (Sandbox Code Playgroud)

输出:

>>>>[array([1, 2, 3]) array([2, 3, 4, 5]) array([6, 7, 8])]
>>>>[[1 2 3]
     [6 7 8]]
Run Code Online (Sandbox Code Playgroud)

或者,您可以删除“坏的”子数组并使用vstack(),如下所示:

import numpy as np

a = np.array([np.array([1,2,3]),np.array([2,3,4,5]),np.array([6,7,8])])
mask = np.array([True, False, True])

d = np.delete(a,np.where(mask==False))
e = np.vstack(d)

print a
print e
Run Code Online (Sandbox Code Playgroud)

输出:

>>>>[array([1, 2, 3]) array([2, 3, 4, 5]) array([6, 7, 8])]
>>>>[[1 2 3]
     [6 7 8]]
Run Code Online (Sandbox Code Playgroud)

我相信对于大型阵列,第二种方法会更快,但我尚未测试时序。


小智 4

我想:

A = map(lambda t: list(t), A)
Run Code Online (Sandbox Code Playgroud)

  • 较短:`map(list, A)` (8认同)