0

Python初学者在这里。
在查看 numpy 文档后,vstack 相当于在形状 (N,) 的一维数组被重新整形为 (1,N) 之后沿第一个轴的串联。

所以下面的代码

a = np.array([[1], [2], [3]])
b = np.array([[2], [3], [4]])
np.vstack((a,b))

应该

np.concatenate((a,b),axis=0))

在将所有一维数组从 (1,) 重塑为 (1,1) 之后,
a 将是

[[[1]]
 [[2]]
 [[3]]]

b 将是

[[[2]]
 [[3]]
 [[4]]]

所以,

np.concatenate((a,b),axis=0)

应该

[[[1]]
 [[2]]
 [[3]]
 [[2]]
 [[3]]
 [[4]]]

但结果显示

[[1]
 [2]
 [3]
 [2]
 [3]
 [4]]

我这边有什么误解吗?请弄清楚我哪里出错了?

4

1 回答 1

1

这是代码:

def vstack(tup):
    arrs = np.atleast_2d(*tup)
    if not isinstance(arrs, list):
        arrs = [arrs]
    return np.concatenate(arrs, 0)

所以它只是确保输入是(至少)二维数组的列表,并在第一个轴上进行连接。

你的数组已经是二维的,所以它只是

In [45]: a = np.array([[1], [2], [3]])
    ...: b = np.array([[2], [3], [4]])
In [46]: a
Out[46]: 
array([[1],
       [2],
       [3]])
In [47]: b
Out[47]: 
array([[2],
       [3],
       [4]])
In [48]: np.concatenate((a,b), axis=0)
Out[48]: 
array([[1],
       [2],
       [3],
       [2],
       [3],
       [4]])

你的“应该”

In [49]: np.concatenate((a[...,None],b[...,None]), axis=0)
Out[49]: 
array([[[1]],

       [[2]],

       [[3]],

       [[2]],

       [[3]],

       [[4]]])
In [50]: _.shape
Out[50]: (6, 1, 1)

添加维度很重要的情况,将 (3,) 数组更改为 (1,3):

In [51]: np.vstack((a.ravel(),b.ravel()))
Out[51]: 
array([[1, 2, 3],
       [2, 3, 4]])
于 2020-11-14T22:17:29.050 回答