我正在尝试使用mapslices
(也许这甚至不是正确的方法),使我能够跨多维数组的“切片”广播函数,其中函数涉及另一个数组,该数组对于广播的每次迭代始终相同。这可以通过 mapslices
或 map
来完成吗?
这是一个特殊的问题:
我有一个函数F(X,Y)
,它将二维数组X
和Y
作为输入。 X 的大小为 (D, N)
且类型 = Array{Float32,2}
),而 Y 的大小也为 (D, 1)
,类型 = Array{Float32,2}
。
F(X,Y)
对两个矩阵 X
和 Y
执行运算,生成大小为 的数组输出(N,1)
。
广播/映射问题:我有一个更大的 3-D 数组 X_all
,其“切片”(例如,矩阵在第三维上堆叠,如 X[:,:,1]
)是维度为 (D,N)
的输入数组 X 的示例,它们应该是 F(X,Y)
的输入。并且 Y
始终保持不变。
因此,示例 X_all
的形状为 (D, N, 5)
,而 Y
仍为 (D, 1)
,我希望广播的输出是一个矩阵,其列存储将 F
应用于 X_all
和 的每个切片的结果是的。因此本例中的最终输出形状应为
(N,5)
。
这不适用于广播
(我收到的错误表明F(X,Y)
正在输入标量 float ,而不是数组),所以我假设它需要使用mapslices
来完成。唯一的问题是,我似乎找不到 mapslices
与多个输入参数一起使用的示例(例如 X
和 Y
)——通常我只用一个输入参数看到它。
有什么想法吗?
最佳答案
您对问题的书面描述对我来说有点难以理解,但如果我正确理解问题,您只需将 mapslices
与匿名函数 X -> F 一起使用(X,Y)
这是一个例子:
F(X, Y) = X'*Y
F(rand(3, 4), rand(3, 1))
#+RESULTS:
: 4×1 Array{Float64,2}:
: 0.2038830017261133
: 0.16952327765859904
: 0.25986519462136687
: 0.18604863369789784
#+BEGIN_SRC jupyter-julia
let D = 3, N = 4
x_all = randn(D, N, 5)
Y = randn(D, 1)
mapslices(X -> F(X, Y), x_all, dims=(1,2))
end
#+RESULTS:
4×1×5 Array{Float64,3}:
[:, :, 1] =
1.949979259990055
0.3939816492611507
-0.8464390217323449
0.4555254821129745
[:, :, 2] =
1.6893553574839384
1.9573396471517739
1.5358035472026144
-1.2706780393752082
[:, :, 3] =
0.999887609119746
0.32959013947652727
0.8756560406754215
-1.0257977117576802
[:, :, 4] =
-0.2252063989697573
-0.5968450960471975
-0.7319338928241739
0.236534278792568
[:, :, 5] =
-0.9523913128029378
0.13537059021324083
0.9514285829484852
0.5464547535310538
关于arrays - Julia:mapslices() 所映射的函数有多个输入参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62901134/