我有两个numpy 2D阵列x& y,尺寸为x(700,5)& Y(10,5)。
当我运行以下命令时,
xy = list(zip(x.T, y.T))
我得到一个包含5个元组的列表。在每个元组中,有两个具有维度(700,)和(10,)的数组。
我需要它们(700,1)和(10,1)。
我该怎么做?
答案 0 :(得分:2)
In [128]: a = np.ones((5,3),int)
In [129]: a.T
Out[129]:
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]])
In [131]: list(zip(a.T, (a+3).T))
Out[131]:
[(array([1, 1, 1, 1, 1]), array([4, 4, 4, 4, 4])),
(array([1, 1, 1, 1, 1]), array([4, 4, 4, 4, 4])),
(array([1, 1, 1, 1, 1]), array([4, 4, 4, 4, 4]))]
zip
迭代输入的第一个暗淡。在这种情况下,它是转置数组的行。所以在每次迭代时都需要一行,一个1d数组。结果是一个元组列表,每个元组由两个1d数组组成。
我们可以在处理前为a
添加维度:
In [132]: a=a[None,:,:]
In [133]: a.shape
Out[133]: (1, 5, 3)
In [134]: a.T.shape
Out[134]: (3, 5, 1)
In [135]: list(zip(a.T, (a+3).T))
Out[135]:
[(array([[1],
[1],
[1],
[1],
[1]]), array([[4],
[4],
[4],
...
[4],
[4]]))]
In [136]: _[0][0].shape
Out[136]: (5, 1)
我不会将其描述为漂亮,但它似乎符合您的要求。
或者您可以使用列表推导来扩展zip,然后添加维度:
In [139]: [(i[:,None],j[:,None]) for i,j in zip(a.T, (a[:2]+3).T)]
Out[139]:
[(array([[1],
[1],
[1],
[1],
[1]]), array([[4],
[4]])), (array([[1],
[1],
[1],
[1],
[1]]), array([[4],
[4]])), (array([[1],
[1],
[1],
[1],
[1]]), array([[4],
[4]]))]
这也有效:
list(zip(*np.atleast_3d(a.T,b.T)))
atleast_3d
可以对数组列表进行操作,使每个数组(M,N,1)。这是一个我不经常使用的专业功能。