为什么np.concatenate更改尺寸

时间:2018-09-08 07:56:27

标签: python numpy

在以下程序中,我试图了解np.concatenate命令的工作方式。通过for循环访问数组的每一行之后,当我沿着行轴进行连接时,我期望二维数组的形状为(5,5),但它会发生变化。

我希望在连接后具有相同的尺寸(5,5)。我该怎么办?

我试图通过将它们存储在列表[(2,5),(2,5),(2,5)]中来对二维数组重复上述方法。最后,当我连接时,它的形状像预期的那样(6,5),但在以下情况下,它是不同的。

a = np.arange(25).reshape(5,5)


ind =[0,1,2,3,4]
list=[]
for i in ind:
    list.append(a[i])

new= np.concatenate(list, axis=0)
print(list)
print(len(list))
print(new)
print(new.shape)

这为new提供了以下结果:

[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]

new.shape

(25,)

1 个答案:

答案 0 :(得分:2)

为此,您实际上不应该在这里使用concatenate

设置

a = np.arange(25).reshape(5,5)
L = [i for i in a]

您有问题要问:

  

np.concatenate为什么要更改尺寸?

这不是 更改尺寸,它正在根据您提供的输入准确执行应有的功能。 From the documentation

  

沿着现有轴加入一系列数组

当您将列表传递给concatenate时,不要将其视为传递(5, 5)列表,而应将其视为传递5个(5,)形状数组轴0,将直观地产生(25,)形状输出。

现在,此行为还提供了有关如何解决此问题的见解。如果传递5个(5,)形状数组产生一个(25,)形状输出,我们只需要传递(1, 5)形状数组来产生一个(5, 5)形状输出。我们可以通过简单地向L的每个元素添加维度来实现此目的:

np.concatenate([[i] for i in L])

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

然而很多更好的方法是简单地使用stackvstack等。

>>> np.stack(L)
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

>>> np.vstack(L)    
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])