gpt4 book ai didi

python - 动态重新定义 numpy 数组

转载 作者:太空宇宙 更新时间:2023-11-03 14:26:17 25 4
gpt4 key购买 nike

我有一个数组,假设:

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 路线,但如果有一种方法可以一次定义所有展开的尺寸,我的代码会更清晰。

提前致谢!

最佳答案

我认为 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 时的唯一要求是你的元素总数不变(即第一个和第二个形状之间的尺寸乘积必须不变)

编辑

如果你想使用切片,你必须传递一个 tuple参数,像这样:

def redim(a, dims):
return a[dims]

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

Numpy 数组在传递参数元组时有一个特殊的行为(这正是像 A[1,2,:] 这样的多索引在幕后所做的),如果你想包装对 [] 的调用接线员,您实际上必须遵守 np.ndarray.__getitem__函数签名。

要获得多维索引,它需要一个整数元组,Noneslice对象(使用切片符号时创建的对象,例如 A[1:2] <=> A.__getitem__(slice(1,2)) )。使用起来非常麻烦,但是如果您坚持数组的 numpy 约定(总结 here),您可以包装所有 numpy 操作

关于python - 动态重新定义 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19936683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com