【问题标题】:numpy shape: rearranging axes to get desired formatnumpy 形状:重新排列轴以获得所需的格式
【发布时间】:2015-03-07 13:32:06
【问题描述】:

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

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

【问题讨论】:

  • 我不认为你可以。 reshape 要求数组的总大小保持不变,将(52,) 的大小调整为(52, 8, 8, 6) 有效地将数组扩展为8*8*6 维度。那有什么意义呢? reshape 用于将 9 元素 ndarray 转换为 3x3 2D ndarray。您所说的听起来像是您想将数组 [0] 的副本复制到数组的扩展版本中。
  • 请展示一个最小的代码示例,该示例导致构造具有奇异形状的 numpy 数组 a。

标签: python arrays numpy indexing shape


【解决方案1】:

听起来你有一个 dtype object 的 NumPy 数组,其中包含 52 个形状为 (8,8,6) 的数组:

import numpy as np
a = np.empty(52, dtype='O')
a[:] = [np.random.random((8,8,6)) for i in range(52)]

这样

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

In [39]: a[0].shape
Out[39]: (8, 8, 6)

假设所有 52 个数组都具有相同的形状和 dtype,您可以使用 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))

In [40]: b.shape
Out[40]: (52, 8, 8, 6)

请注意,在数值 dtype 的数组上执行 NumPy 数值运算要快得多 -- not object dtype。因此,理想情况下,您首先要避免创建数组a。最好不要使用np.fromiter,而是重新编写定义a 的代码,以便从一开始就构建所需的形状数组(52、8、8、6)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多