【发布时间】:2018-11-06 07:38:25
【问题描述】:
在 Python/Numpy 中,我可以以这种形式对数组进行切片:
arr = np.ones((3,4,5))
arr[2]
形状将保持不变:
(arr[2]).shape # prints (4, 5)
这意味着,如果我想保持数组的形状,以下代码适用于 N 维数组
arr = np.ones((3,4,5,2,2))
(arr[2]).shape # prints (4, 5, 2, 2)
如果我想编写适用于 N 维数组并保留其输出的函数,那就太好了。
然而,在 Julia 中,相同的操作不会保留结构:
arr = ones(3,4,5)
size(arr[3]) # prints () (0-dimensinoal)
size(arr[3,:]) # prints (20,)
因为部分线性索引。因此,如果要保留原始尺寸,我需要编写 arr[3,:,:],它仅适用于 3D 数组。如果我想要一个 4D 数组,我将不得不使用 arr[3,:,:,:] 等等。代码不通用。
此外,当您获得 5 维或更多维的数组时(我现在正在使用的就是这种情况),这种表示法会变得非常麻烦。
有什么方法可以像在 Python 中那样编写代码并使其通用?我什至想不出一个干净的 reshape 方法,更不用说像 Python 一样干净的方法了。
【问题讨论】:
-
不确定是否最好,但您可以使用
arr[3, axes(arr)[2:end]...]。或者一般存储axes的结果,然后修改您需要的任何尺寸。这个函数从 Julia 0.7 开始就存在了。 -
@BogumiłKamiński 我以为 0.7 还没有出来。我正在我的 0.6.2 上尝试它,确实它不起作用。