我有一个格式如下的数据集:
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)
我该怎么做,最好没有循环? 感谢。
答案 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())