Python - 将数组列表转换为二维数组

19

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

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)

我怎样做到这一点,最好不用循环?谢谢。


2
请发布一些样本数据。 - Ashwini Chaudhary
3
A是什么?是Python列表还是NumPy数组?看起来你只需要使用numpy.array(A)。问题具体在哪里? - tobias_k
1
指向 numpy.array(A) 的评论和答案都是正确的,但有一个警告:内部元素(无论它们是元组、列表还是 np.arrays 本身)必须具有相同的长度。如果它们长度不同,你仍然会得到 A.shape = (3,),而且 A 的数据类型将为 object。我曾经因为元素意外地具有不同的长度而被卡住过。 - mattsilver
4个回答

21

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

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)

8
如果我正确理解你的问题,你遇到了一个情况,即numpy没有将数组转换为二维数组。当你的数组大小不相同时,这种情况可能会发生。例如:
自动转换为二维数组:
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]]

我认为对于大型数组来说第二种方法会更快,但我还没有测试时间。


4
我认为如下:

我认为:

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

8
将A映射为列表:map(list, A) - tobias_k

3
如果你有一个元组数组,一个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())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接