【问题标题】:Drop Julia array dimensions of length 1删除长度为 1 的 Julia 数组维度
【发布时间】:2018-02-27 14:18:53
【问题描述】:

假设我有一个大小为 1024x1024x1x1x100 的 5D 数组。如何制作一个 1024x1024x100 的新数组?

如果您提前知道要保留哪些维度,则以下方法有效:

arr = arr[:, :, 1, 1, :]

但是我不知道哪些尺寸是提前的尺寸,我只想保留给定布尔掩码的尺寸;像这样...

arr2 = arr[(size(arr) .> 1)]

【问题讨论】:

  • 尝试squeeze(a,(find(size(a).==1)...)) 和一般squeezereshapesize 应该进行操作。
  • 你为什么要这样做?
  • @DanGetz squeeze 非常适合这个,你能把它写成答案,我会标记它并解决吗?谢谢!
  • @MichaelK.Borregaard 这是我为github.com/tlnagy/OMETIFF.jl 所做的一些重构,我正在从数据集中读取 5D 图像,它们可能需要也可能不需要所有 5 个维度。它使代码在读取图像后而不是更早地删除尺寸变得更简单。

标签: arrays julia


【解决方案1】:

squeeze 函数是专门为删除长度为 1 的维度而定义的。来自手册:

Base.squeeze - 函数。

squeeze(A, dims)

删除尺寸 由数组 A 中的 dims 指定。 dims 的元素必须是唯一的,并且 在1:ndims(A) 范围内。对于dims 中的所有isize(A,i) 必须等于 1。

要“挤压”所有大小为 1 的维度(当它们事先未知时),我们需要找到它们并将它们制成一个元组。这是由((size(arr).==1)...) 完成的。所以结果是:

squeeze(a,(find(size(a).==1)...))

【讨论】:

  • 我实际上可能最终会使用reshape,因为squeeze 分配了一个新数组,但squeeze 似乎是专门为这种情况而设计的。
  • @tlnagy squeeze是使用reshape实现的,所以你可以使用它,它不会分配新的数组(只是通过修改一个元素来测试它)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多