向numpy矩阵添加维数

2024-09-29 02:18:16 发布

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

为什么下面的代码没有向矩阵中添加第三个维度?我应该如何更改代码以获得所需的内容?在

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)

Tags: to代码内容lenifnpzeros矩阵
3条回答

imm.reshape不执行就地修改。相反,它返回修改后的数组。在

因此,执行imm = imm.reshape((dims[0], dims[1], 1)),您将获得所需的输出。请考虑阅读documentation以了解更多详细信息

向numpy数组添加维度的最佳方法是

imm = imm[..., np.newaxis]

别担心,这不会进行任何昂贵的复制或其他操作,底层内存仍保留在原位*。所发生的一切就是ndim增加1。在

我认为这个解决方案更干净,因为您不必担心抓取shape并将其放入reshape。它还有一个优点,可以快速地将newaxis放入任何维度。假设您希望维度0或1成为新维度

^{pr2}$

*你可以通过

x = np.array([1,2,3])
y = x[..., np.newaxis]
x *= 10
print(y)
# 
# [[10]
#  [20]
#  [30]]

有很多方法可以改变数组的维数,只要新维度中大小的乘积与旧维度的乘积相同。在

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

对数组对象进行适当整形的唯一方法是将其^{}属性赋值:

arr.shape += (1,)

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

  1. 使用^{}

    arr = np.reshape(arr, arr.shape + (1,))
    
  2. 使用^{}。其工作原理与np.reshape完全相同:

    arr = arr.reshape(arr.shape + (1,))
    
  3. ^{}(又称None)索引数组:

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

    或者

    arr = arr[..., None]
    

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

  4. 使用^{}。这将在您通过第二个参数告诉它的任何位置插入一个大小为1的新维度:

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

    arr = np.atleast_3d(arr)
    

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

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

    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,))

只要记住^{}真的是一个核大锤!在

相关问题 更多 >