动态调整numpy数组的尺寸

3

我有一个数组,假设为:

A = np.array([1., 2.])

我可以简单地执行以下操作来添加一个新的维度:

我只需做类似于以下的事情:

def redim(arr):
   return arr[:, None]

现在,我想通过以下方式动态添加额外的维度:
def redim(arr, dims):
   return arr[dims]

所以,我可以做以下这些事情:

redim(A, [:, None])
redim(A, [None, :])
redim(A, [none, :, None])

有人知道这是否可能吗?

第二个参数应该是什么类型,以便我可以动态修改它?(字符串、对象、列表)?如何连接两个参数以获取扩展数组?

我知道我可以通过使用expand_dims方法来实现,但如果有一种方法可以一次性定义所有扩展的维度,那么我的代码将会更清晰。

先感谢您!

1个回答

5
我认为reshape是你在寻找的内容。
如果说弦理论教会我们什么,那就是每个事物都需要11个维度。
>>> A = np.array([1,2])
>>> A = A.reshape((2,1,1,1,1,1,1,1,1,1,1))
>>> A
array([[[[[[[[[[[1]]]]]]]]]],






   [[[[[[[[[[2]]]]]]]]]]])

现在您可以沿任何维度获取切片:

>>> A[1,:,:,:,:,0]
array([[[[[[[[[2]]]]]]]]])

使用reshape的唯一要求是您的元素总数不变(即,在第一个和第二个形状之间,尺寸的乘积必须保持不变)。 编辑 如果您仍然想要使用切片,您必须传递一个参数元组,例如:
def redim(a, dims):
    return a[dims]

>>> redim(A, (slice(None), None, slice(None), None))

Numpy数组在传递元组参数时具有特殊行为(这正是类似 A[1,2,:] 的多重索引在底层执行的操作),如果你想要包装对 [] 运算符的调用,则实际上必须遵守np.ndarray.__getitem__ 函数的签名。为了获取多维索引,该函数需要一个由int、None或slice对象组成的元组(当使用切片符号时生成slice对象,例如A[1:2] <=> A.__getitem__(slice(1,2)))。尽管使用起来相当麻烦,但如果你遵循numpy数组的约定(总结在此处),便可以包装所有numpy操作。

reshape 返回原始数组的视图,不修改原始数组。如果您想要就地进行 redim,必须像这个答案中一样使用 A = A.reshape(newshape),或者使用 A.resize(newshape)A.shape = newshape 来真正地在原地操作。 - askewchan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接