zip()之后的Numpy数组维度

2024-04-26 20:21:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个numpy2d数组x&y,尺寸为x(700,5)和y(10,5)。你知道吗

当我运行以下命令时

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

我得到一个有5个元组的列表。在每个元组中,有两个维度为(700,)和(10,)的数组。你知道吗

我需要它们是(700,1)和(10,1)。你知道吗

我该怎么做?你知道吗


Tags: 命令列表尺寸数组ziplist元组xy
1条回答
网友
1楼 · 发布于 2024-04-26 20:21:52
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迭代输入的第一个dim。在本例中,是换位数组的行。所以每次迭代都取一行,一个一维数组。结果是一个元组列表,每个元组由两个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)。这是一个我不经常使用的特殊函数。你知道吗

相关问题 更多 >