【问题标题】:Numpy-like slicing in JuliaJulia 中类似 Numpy 的切片
【发布时间】: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 上尝试它,确实它不起作用。

标签: python arrays julia


【解决方案1】:

请注意,在 Python 中,只有在对数组的第一个维度进行切片时才会保留形状。在 Julia 中,您可以使用 slicedim(A, d, i) 在索引 i 处对数组 A 的维度 d 进行切片。

【讨论】:

  • 不,你也可以切片其他维度。在 numpy 中,您不需要尾随 :。就是这样。
  • 我有没有说过你不能在 Python @Kiuhnm 中切片其他维度?
  • 我指的是形状保存,@juliohm。你回答的第一句话是假的。如果x 是2x3x4x5,那么x[:,0] 是2x4x5。
  • 好的,所以形状保存是另一个问题。从您之前的评论中,您确认可以切分其他维度,而我从未说过不是这种情况。关于在最近版本的 Python 中可能发生变化的形状保存,我不确定。这些天我不使用 Python。
猜你喜欢
  • 2019-10-27
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 2022-01-16
  • 2021-11-17
  • 1970-01-01
相关资源
最近更新 更多