Python numpy形状:重新排列轴以获得所需格式

Python numpy形状:重新排列轴以获得所需格式,python,arrays,numpy,indexing,shape,Python,Arrays,Numpy,Indexing,Shape,我有一个形状为(52,)的numpy数组“a”。当我做[0]形状时,我得到(8,8,6)。如何修改“a”以使a.shape等于(52,8,8,6) 我已尝试重新调整数组的形状,但未能获得所需的形状。听起来您有一个数据类型对象的NumPy数组,其中包含52个形状数组(8,8,6): 所以 In [38]: a.shape Out[38]: (52,) In [39]: a[0].shape Out[39]: (8, 8, 6) 假设所有52个数组具有相同的形状和数据类型,可以使用np.from

我有一个形状为(52,)的numpy数组“a”。当我做[0]形状时,我得到(8,8,6)。如何修改“a”以使a.shape等于(52,8,8,6)


我已尝试重新调整数组的形状,但未能获得所需的形状。

听起来您有一个数据类型
对象的NumPy数组,其中包含52个形状数组(8,8,6):

所以

In [38]: a.shape
Out[38]: (52,)

In [39]: a[0].shape
Out[39]: (8, 8, 6)
假设所有52个数组具有相同的形状和数据类型,可以使用
np.fromiter
和生成器表达式将其转换为形状数组(52,8,8,6),以展平值:

b = (np.fromiter(
    (val for arr in a for val in arr.ravel()), 
    count=(a.size)*(a[0].size), dtype=a[0].dtype)
     .reshape(a.shape+a[0].shape))



请注意,当对数值数据类型--
对象
dtype的数组执行NumPy数值操作时,速度要快得多。因此,理想情况下,首先要避免创建数组
a
。与其使用
np.fromiter
,您最好重新编写定义
a
的代码,以便从一开始就构建所需的形状数组(52,8,8,6)。

我认为您做不到<代码>重塑
要求数组的总大小保持不变,将
(52,)
调整为
(52,8,8,6)
有效地扩展数组的
8*8*6
维度。重点是什么<代码>重塑可将9元素阵列转换为3x3 2D阵列。您所说的听起来像是要将数组[0]复制到数组的扩展版本中。请给出一个最小的代码示例,该示例可以生成具有奇异形状的numpy数组。
b = (np.fromiter(
    (val for arr in a for val in arr.ravel()), 
    count=(a.size)*(a[0].size), dtype=a[0].dtype)
     .reshape(a.shape+a[0].shape))
In [40]: b.shape
Out[40]: (52, 8, 8, 6)