【问题标题】:Marginalise over n dimensional array边缘化 n 维数组
【发布时间】:2016-10-30 14:06:12
【问题描述】:

我正在尝试弄清楚如何在 julia 中处理多维数组。我有一个多维数组A = rand(5,5,5)

我试图弄清楚如何使用输入 m 给出的: 的位置来获取A[1,1,:]A[1,:,1]A[:,1,1]

我想出了

indexData = [:,1,2]
indexData[1],indexData[m] = indexData[m],indexData[1]
data = A[indexData[1],indexData[2],indexData[3]]

但这似乎过于复杂,如果A 的维度未知,则无法扩展。有没有更好的方法来解决这个问题?

【问题讨论】:

  • 标题中的 Marginalize 建议在某个维度上求和(如边际概率)。如果想法只是选择元素,那么标题可能会令人困惑。
  • 是的,最后我将边缘化指定的尺寸。但是,我正在处理 logpdf,因此无法直接对 pdf 求和。如果您对标题有更好的想法,我很乐意更改它。

标签: multidimensional-array julia


【解决方案1】:

以下可能符合要求:

getshaft(A,ii,m) = [A[(i==m?j:ii[i] for i=1:length(ii))...] for j=1:size(A,m)]

考虑以下示例:

julia> A = reshape(collect(1:27),3,3,3)
3×3×3 Array{Int64,3}:
[:, :, 1] =
 1  4  7
 2  5  8
 3  6  9

[:, :, 2] =
 10  13  16
 11  14  17
 12  15  18

[:, :, 3] =
 19  22  25
 20  23  26
 21  24  27

julia> getshaft(A,(1,2,3),1)
3-element Array{Int64,1}:
 22
 23
 24

第二个参数是元素索引,第三个选择维度。 getshaft 将沿第三个参数指定的维度返回包含第二个参数选择的元素的值向量。第一个参数当然是数组。

--- 更新---

快速回顾,建议以更快、更简洁的方式实现相同功能:

getshaft(A,ii,m) = A[(i==m?Colon():ii[i] for i=1:length(ii))...]

使用切片索引可能会受益于更快的索引计算或后台的其他 AbstractArray 魔法。

【讨论】:

  • 谢谢,这正是我需要的!
  • 谢谢,如果有人感兴趣,这是我最后使用的。 getshaft(A,ii,m) = A[(i in m?Colon():shift!(ii) for i=1:(length(ii)+length(m)))...].
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 2017-07-06
相关资源
最近更新 更多