zip()后的Numpy数组维度

时间:2018-02-05 03:52:25

标签: python numpy

我有两个numpy 2D阵列x& y,尺寸为x(700,5)& Y(10,5)。

当我运行以下命令时,

xy = list(zip(x.T, y.T))

我得到一个包含5个元组的列表。在每个元组中,有两个具有维度(700,)和(10,)的数组。

我需要它们(700,1)和(10,1)。

我该怎么做?

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)。这是一个我不经常使用的专业功能。