在n维数组上进行边缘化

8

我正在尝试弄清楚如何在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的维度未知,则无法扩展。是否有更好的解决方法?


1
标题中的“边缘化”意味着在某个维度上求和(如边缘概率)。如果想要选择元素,标题可能会让人感到困惑。 - Dan Getz
是的,最终我会在指定的维度上进行边际化处理。但是,由于我正在处理logpdf,因此无法直接对pdf求和。如果您有更好的标题想法,我很乐意更改它。 - drd13
1个回答

7
以下内容可能符合要求:
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魔法。

谢谢,这正是我所需要的! - drd13
1
谢谢!这是我最终使用的代码,如果有人感兴趣的话:getshaft(A,ii,m) = A[(i in m?Colon():shift!(ii) for i=1:(length(ii)+length(m)))...] - drd13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接