多维数组

2024-03-29 12:04:57 发布

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

我有一个shape (5,2)数组,每一行由一个shape (4,3,2)和一个浮点数组成。在

在对数组[:,0]切片后,我得到一个形状为(5,)的数组,每个元素的形状都是(4,3,2),而不是形状(5,4,3,2)的数组(即使我使用np.array())。在

为什么?在

已编辑

示例:

a1 = np.arange(50).reshape(5, 5, 2)
a2 = np.arange(50).reshape(5, 5, 2)

b1 = 15.0
b2 = 25.0

h = []
h.append(np.array([a1, b1]))
h.append(np.array([a2, b2]))

h = np.array(h)[:,0]
np.shape(h) # (2,)
np.shape(h[0]) # (5, 5, 2)
np.shape(h[1]) # (5, 5, 2)
h = np.array(h)
np.shape(h) # (2,) Why not (2, 5, 5, 2)?

Tags: a2元素a1np切片数组arrayb2
3条回答
In [121]: a1.dtype, a1.shape
Out[121]: (dtype('int32'), (5, 5, 2))
In [122]: c1 = np.array([a1,b1])
In [123]: c1.dtype, c1.shape
Out[123]: (dtype('O'), (2,))

因为a1和{}是不同形状的对象(b1甚至不是数组),因此由它们组成的数组将具有dtype对象。而由几个组成的h仍然是object-dtype。在

^{pr2}$

在appends之后,h(作为数组)是object dtype。第2列是b1和b2值,第1列是a1和a2。在

要将这些a1a2数组组合成一个数组,需要某种形式的连接。stack在一个新的轴上执行。在

In [128]: h[0,0].shape
Out[128]: (5, 5, 2)
In [129]: np.array(h[:,0]).shape     # np.array doesn't cross the object boundary
Out[129]: (2,)
In [130]: np.stack(h[:,0]).shape
Out[130]: (2, 5, 5, 2)
In [131]: np.concatenate(h[:,0],0).shape
Out[131]: (10, 5, 2)

将(2,)数组转换为一个列表,确实允许np.array将元素重新组合成一个更高维的数组,就像np.stack一样:

In [133]: np.array(list(h[:,0])).shape
Out[133]: (2, 5, 5, 2)

您有一个objects数组;如果您确定所有子元素都具有相同的形状,则可以使用np.stack将其转换为所需的形状:

np.stack(a[:,0])

^{pr2}$

你似乎相信纽比可以神奇地预言你的意图。正如@Barmar在注释中解释的那样,当您用[:, 0]分割一个shape(5,2)数组时,将得到该数组第一列的所有行。该切片的每个元素都是一个shape(4,3,2)数组。纽比给了你你想要的东西。在

如果要将其转换为shape(5,4,3,2)数组,则需要执行进一步的处理以从shape(4,3,2)数组中提取元素。在

相关问题 更多 >