在以下程序中,我试图了解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,)
答案 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]])
然而,很多更好的方法是简单地使用stack
,vstack
等。
>>> 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]])