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

时间:2014-01-10 14:10:32

标签: python arrays numpy

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

A=[(Num1,Num2,Num3), (Num4,Num5,Num6), (Num7,Num8,Num9)]

A.shape = (3,)

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

A=[[Num1,Num2,Num3],[Num4,Num5,Num6],[Num7,Num8,Num9]]

A.shape = (3,3)

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

4 个答案:

答案 0 :(得分:10)

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

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

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

Ah = np.vstack(A)
Av = np.hstack(A)

答案 1 :(得分:4)

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

自动转换为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

输出:

>>>[[1 2 3]
    [2 3 4]
    [6 7 8]]

无自动转换(在第二个子阵列中查找更改):

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

输出:

>>>[array([1, 2, 3]) array([2, 3, 4, 5]) array([6, 7, 8])]

我找到了几种将数组数组转换为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

输出:

>>>>[array([1, 2, 3]) array([2, 3, 4, 5]) array([6, 7, 8])]
>>>>[[1 2 3]
     [6 7 8]]

或者您可以删除“坏”子阵列并使用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

输出:

>>>>[array([1, 2, 3]) array([2, 3, 4, 5]) array([6, 7, 8])]
>>>>[[1 2 3]
     [6 7 8]]

我相信大型阵列的第二种方法会更快,但我没有测试时间。

答案 2 :(得分:3)

我想:

A = map(lambda t: list(t), A)

答案 3 :(得分:1)

如果您拥有的是一系列tupples。带有dtype = object的(3,)数组 我知道,没有办法通过广播优雅地将它们打包成(3,3)阵列。转换回列表,然后创建一个新数组似乎是最简单的。

In [314]: data
Out[314]: array([(1, 2, 3), (4, 5, 6), (7, 8, 9)], dtype=object)
In [315]: data.shape
Out[315]: (3L,)

data2 = np.empty((3,3), dtype=int)

#Neither of these work.
data2[:] = data[:]
data2[:] = data[:, None]

#This will work, but requires looping
data2[0,:] = data[0]
data2[1,:] = data[1]
data2[2,:] = data[2]

#This is the easies way i could find
data2 = np.array(data.tolist())