Мигрирам от python/numpy към julia. Наистина съм объркан от многомерните масиви на Джулия и има чувството, че има някакво допълнително ниво на сложност / караница (в сравнение с numpy).
Има разлика между 1)редове-вектори 2)колони-вектори, 3)многоизмерни масиви и 4)вложени масиви (=Масиви от масиви). Това би било добре (може би полезно за оптимизиране на производителността), ако приемем, че има лесен начин за конвертиране между тях. Но не мога да разбера как да го направя.
Прост пример: Просто се опитвам да генерирам 2D правоъгълна мрежа от точки и да ги начертая
ps = [ [ix*0.1 iy*0.1] for ix=1:10, iy=1:10 ]
# 10×10 Array{Array{Float64,2},2}:
# Oh, this is nested array? I wand just simple 3D array 10x10x2
scatter( ps[:,:,1], ps[:,:,2], markersize = 2, markerstrokewidth = 0, aspect_ratio=:equal )
# ERROR: BoundsError: attempt to access 10×10 Array{Array{Float64,2},2} at index [Base.Slice(Base.OneTo(10)), Base.Slice(Base.OneTo(10)), 2]
sh = size(ps)
# (10,10)
ps = reshape( ps, ( sh[1]*sh[2],2) )
# ERROR: DimensionMismatch("new dimensions (100, 2) must be consistent with array size 100")
# Oh dear :(
ps = reshape( ps, ( sh[1]*sh[2],:) )
# 100×1 Array{Array{Float64,2},2}
xs = ps[:,1]
# 100-element Array{Array{Float64,2},1}
# ??? WTF? ... this arrays looks like whole 'ps'
ys = ps[:,2]
# ERROR: BoundsError: attempt to access 100×1 Array{Array{Float64,2},2} at index [Base.Slice(Base.OneTo(100)), 2]
xs = ps[:][1]
# 1×2 Array{Float64,2}:
# 0.1 0.1
# But I want all xs (ps[:,1]), not (ps[1,:])
# Let's try some broadcasting
xs = ps.[1]
# ERROR: syntax: invalid syntax "ps.[1]"
xs = .ps[1]
# ERROR: syntax: invalid identifier name "."
# Perhaps transpose will help?
ps_ = ps' #' stackoverflow syntax highlighting for Julia is broken ?
# 1×100 LinearAlgebra.Adjoint{LinearAlgebra.Adjoint{Float64,Array{Float64,2}},Array{Array{Float64,2},2}}:
# OMG! ... That is even worse
scatter( ps[:,1], ps[:,2], markersize = 2, markerstrokewidth = 0, aspect_ratio=:equal )
# Nope
Добре, това някак работи. Но все пак трябва да разбера как да конвертирам между различните форми на масиви по-горе
using Plots
ps = [ [ix*0.1 iy*0.1] for ix=1:10, iy=1:10 ]
ps = vcat(ps...)
xs = ps[:,1]
ys = ps[:,2]
scatter( xs, ys, markersize = 2, markerstrokewidth = 0, aspect_ratio=:equal )
РЕДАКТИРАНЕ:
Може би би било добре да изброя някои уроци, където търсих отговора, преди да попитам:
arr.[index]
не работи, ноgetindex.(arr, index)
работи. Квадратните скоби са просто синтактична захар заgetindex
повикване. - person crstnbr   schedule 16.10.2019@. floor(Int, sqrt(a) + sqrt(b))
) не работеше, докато не осъзнах, че има значение дали пиша там[2 3 4 5]
или[2, 3, 4, 5]
. И разбирането като[ [ix*0.1 iy*0.1] for ix=1:10, iy=1:10 ]
винаги произвежда колонен вектор. - person Prokop Hapala   schedule 17.10.2019[2 3 4 5]
създава 2D масив, докато[2, 3, 4, 5]
създава 1D масив. - person DNF   schedule 17.10.2019