Skip to main content
 首页 » 编程设计

python之向 numpy 矩阵添加维度

2025年05月04日16unruledboy

为什么以下代码没有向矩阵添加第三维,我应该如何更改代码以获得我需要的内容?

imm = np.zeros(shape=(10,10)) 
dims = imm.shape 
if len(dims) < 3: 
    imm.reshape((dims[0], dims[1], 1)) 
imm.shape # I want this to pring (10,10,1) 

请您参考如下方法:

有多种方法可以改变数组的维度,只要新维度的大小乘积与旧维度的乘积保持一致即可。

在除一种情况之外的所有情况下, reshape 操作都会返回一个新的数组对象,但使用内存中相同的底层数据。这意味着 reshape 非常便宜,即使对于巨大的阵列也是如此。您只需将返回的引用分配回原始数组即可。

就地 reshape 数组对象的唯一方法是分配给它的 shape属性:

arr.shape += (1,) 

所有其他添加维度的方法都返回一个新的数组对象。在大多数情况下,它们不会复制数据,除非您对索引方案做了一些奇怪的事情:

  1. 使用 np.reshape :

    arr = np.reshape(arr, arr.shape + (1,)) 
    
  2. 使用 arr.reshape .这与 np.reshape 完全一样:

    arr = arr.reshape(arr.shape + (1,)) 
    
  3. 索引数组 np.newaxis (又名 None):

    arr = arr[..., np.newaxis] 
    

    或

    arr = arr[..., None] 
    

    这将创建一个新的数组对象,将大小为 1 的新轴插入到您放置 newaxis 对象的任何位置的索引方案中,但保持底层数据不变。

  4. 使用 np.expand_dims .这将在您通过第二个参数告诉它的任何地方插入一个大小为 1 的新维度:

    arr = np.expand_dims(arr, -1) 
    
  5. 对于您的特定情况,您可以使用 np.atleast_3d :

    arr = np.atleast_3d(arr) 
    

    当给定一维输入时,此函数的行为很奇怪:它将大小为 1 的维度放在元组的开头和结尾,而不是全部放在一侧。不过,2D 案例的行为完全符合您的要求。

  6. 使用 np.array显式创建具有预期维数的新数组对象:

    arr = np.array(arr, copy=False, ndmin=3) 
    

    copy=False 必须明确声明以避免复制数据。第三个轴将被添加到到形状中,而不是附加到形状中,因此您可能需要做类似的事情

    arr = np.moveaxis(arr, 0, -1) 
    

    到目前为止,这是满足您的特定需求的最不理想的选择。

更新

如果我们将您的原始问题等同于图钉,那么这里是解决方案的核心大锤:

arr = np.lib.stride_tricks.as_strided(arr, arr.shape + (1,)) 

请记住 as_strided真的是核大锤!