[英]Slice array of arrays in Julia
在朱莉婭,我有一個陣列數組,說:
arr = Array(Array{Float64,1},3)
for i = 1:3
arr[i] = [i,-i]
end
現在:
arr[:][1]
2-element Array{Float64,1}:
1.0
-1.0
和
arr[1][:]
2-element Array{Float64,1}:
1.0
-1.0
看來獲得第一個“專欄”的唯一方法就是理解
pluses = [arr[i][1] for i=1:length(arr)]
3-element Array{Any,1}:
1.0
2.0
3.0
這確實是唯一的方法嗎? 通過運行for循環而不是某些“矢量化”版本,我是否會失去速度,或者由於編譯器不同而在Julia中無關緊要?
在Julia 0.5或更高版本中,你可以使用getindex.(arr, 1)
來提取arr
中每個數組的第一個元素。 這非常有效,特別是因為它可以使用“點調用”語法與其他元素操作融合。
使用[]
索引無法完成此操作。 每個[]
操作都是一個獨立的操作(調用getindex)。 您已經嘗試通過調用arr[:][1]
“切片”嵌套數組。 這里有兩個獨立的操作:第一個, (arr[:])
,然后是(arr[:])[1]
。 但在這種情況下arr[:] == arr
! 類似地,對於arr[1][:]
- 你只是得到第一個向量的所有元素。 這就是為什么兩人都回歸同樣的事情。
你的理解是一個很好的解決方案。 與舊的* MATLAB版本不同,Julia的JIT使得循環比矢量化的替代方案更快。 如果您來自Matlab或Python,需要一些時間來習慣。 但它允許您以非常有效的方式遍歷這些復雜的結構。
關於你的評論,他們在這種情況下使用向量向量而不是向多維數組添加列的原因是目前只有向量可以增長。 您可以通過調用hcat(arr...)
將Vector of Vector復制到二維數組中,但如果您的矢量非常大(數百萬個元素),則復制本身會相當慢。
*(Matlab的最新版本也有一個JIT,它也可以使一些 for循環比矢量化更快,但是當它開始時是不可預測的。對於循環,這些天幾乎總是比使用自定義函數的arrayfun / cellfun快,我的經驗)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.