2024-09-29 02:18:16 发布
网友
为什么下面的代码没有向矩阵中添加第三个维度?我应该如何更改代码以获得所需的内容?在
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)
imm.reshape不执行就地修改。相反,它返回修改后的数组。在
imm.reshape
因此,执行imm = imm.reshape((dims[0], dims[1], 1)),您将获得所需的输出。请考虑阅读documentation以了解更多详细信息
imm = imm.reshape((dims[0], dims[1], 1))
向numpy数组添加维度的最佳方法是
imm = imm[..., np.newaxis]
别担心,这不会进行任何昂贵的复制或其他操作,底层内存仍保留在原位*。所发生的一切就是ndim增加1。在
ndim
我认为这个解决方案更干净,因为您不必担心抓取shape并将其放入reshape。它还有一个优点,可以快速地将newaxis放入任何维度。假设您希望维度0或1成为新维度
shape
reshape
newaxis
*你可以通过
x = np.array([1,2,3]) y = x[..., np.newaxis] x *= 10 print(y) # # [[10] # [20] # [30]]
有很多方法可以改变数组的维数,只要新维度中大小的乘积与旧维度的乘积相同。在
除一种情况外,在所有情况下,整形操作都会返回一个新的数组对象,但在内存中使用相同的底层数据。这意味着整形是非常便宜的,即使对于巨大的阵列也是如此。您只需将返回的引用分配回原始数组。在
对数组对象进行适当整形的唯一方法是将其^{}属性赋值:
arr.shape += (1,)
添加维度的所有其他方法都返回一个新的数组对象。在大多数情况下,它们不会复制数据,除非您对索引方案做了一些奇怪的操作:
使用^{}:
arr = np.reshape(arr, arr.shape + (1,))
使用^{}。其工作原理与np.reshape完全相同:
np.reshape
arr = arr.reshape(arr.shape + (1,))
用^{}(又称None)索引数组:
None
arr = arr[..., np.newaxis]
或者
arr = arr[..., None]
这将创建一个新的数组对象,在索引方案中插入一个大小为1的新轴,无论您将newaxis对象放在何处,但底层数据保持不变。
使用^{}。这将在您通过第二个参数告诉它的任何位置插入一个大小为1的新维度:
arr = np.expand_dims(arr, -1)
对于您的特定情况,可以使用^{}:
arr = np.atleast_3d(arr)
当给定一个1D输入时,这个函数的行为很奇怪:它将大小为1的维度放在元组的开头和结尾,而不是全部放在一边。不过,2D用例的行为完全符合您的需要。
使用^{}显式创建具有预期维数的新数组对象:
arr = np.array(arr, copy=False, ndmin=3)
必须显式声明copy=False以避免复制数据。第三个轴将预先添加到形状中,而不是附加到形状中,因此您可能需要执行以下操作:
copy=False
arr = np.moveaxis(arr, 0, -1)
对于你的特殊需求,这是目前为止最不可取的选择。
更新
如果我们把你最初的问题等同于一个图钉,下面是一个解决方案的核重锤:
arr = np.lib.stride_tricks.as_strided(arr, arr.shape + (1,))
只要记住^{}真的是一个核大锤!在
imm.reshape
不执行就地修改。相反,它返回修改后的数组。在因此,执行
imm = imm.reshape((dims[0], dims[1], 1))
,您将获得所需的输出。请考虑阅读documentation以了解更多详细信息向numpy数组添加维度的最佳方法是
别担心,这不会进行任何昂贵的复制或其他操作,底层内存仍保留在原位*。所发生的一切就是
ndim
增加1。在我认为这个解决方案更干净,因为您不必担心抓取
^{pr2}$shape
并将其放入reshape
。它还有一个优点,可以快速地将newaxis
放入任何维度。假设您希望维度0或1成为新维度*你可以通过
有很多方法可以改变数组的维数,只要新维度中大小的乘积与旧维度的乘积相同。在
除一种情况外,在所有情况下,整形操作都会返回一个新的数组对象,但在内存中使用相同的底层数据。这意味着整形是非常便宜的,即使对于巨大的阵列也是如此。您只需将返回的引用分配回原始数组。在
对数组对象进行适当整形的唯一方法是将其^{} 属性赋值:
添加维度的所有其他方法都返回一个新的数组对象。在大多数情况下,它们不会复制数据,除非您对索引方案做了一些奇怪的操作:
使用^{} :
使用^{} 。其工作原理与
np.reshape
完全相同:用^{} (又称
None
)索引数组:或者
这将创建一个新的数组对象,在索引方案中插入一个大小为1的新轴,无论您将
newaxis
对象放在何处,但底层数据保持不变。使用^{} 。这将在您通过第二个参数告诉它的任何位置插入一个大小为1的新维度:
对于您的特定情况,可以使用^{} :
当给定一个1D输入时,这个函数的行为很奇怪:它将大小为1的维度放在元组的开头和结尾,而不是全部放在一边。不过,2D用例的行为完全符合您的需要。
使用^{} 显式创建具有预期维数的新数组对象:
必须显式声明
copy=False
以避免复制数据。第三个轴将预先添加到形状中,而不是附加到形状中,因此您可能需要执行以下操作:对于你的特殊需求,这是目前为止最不可取的选择。
更新
如果我们把你最初的问题等同于一个图钉,下面是一个解决方案的核重锤:
只要记住^{} 真的是一个核大锤!在
相关问题 更多 >
编程相关推荐