为什么以下代码没有向矩阵添加第三维,我应该如何更改代码以获得我需要的内容?
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,)
所有其他添加维度的方法都返回一个新的数组对象。在大多数情况下,它们不会复制数据,除非您对索引方案做了一些奇怪的事情:
使用
np.reshape:arr = np.reshape(arr, arr.shape + (1,))使用
arr.reshape.这与np.reshape完全一样:arr = arr.reshape(arr.shape + (1,))索引数组
np.newaxis(又名None):arr = arr[..., np.newaxis]或
arr = arr[..., None]这将创建一个新的数组对象,将大小为 1 的新轴插入到您放置
newaxis对象的任何位置的索引方案中,但保持底层数据不变。使用
np.expand_dims.这将在您通过第二个参数告诉它的任何地方插入一个大小为 1 的新维度:arr = np.expand_dims(arr, -1)对于您的特定情况,您可以使用
np.atleast_3d:arr = np.atleast_3d(arr)当给定一维输入时,此函数的行为很奇怪:它将大小为 1 的维度放在元组的开头和结尾,而不是全部放在一侧。不过,2D 案例的行为完全符合您的要求。
使用
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真的是核大锤!
