Я перехожу с python / numpy на julia. Меня действительно смущают многомерные массивы Джулии, и мне кажется, что есть некоторый дополнительный уровень сложности / проблем (по сравнению с numpy).
Существует различие между 1) векторами строк, 2) векторами-столбцами, 3) многомерными массивами и 4) вложенными массивами (= Массивы массивов). Это было бы хорошо (возможно, полезно для оптимизации производительности), если есть простой способ преобразования между ними. Но я не могу понять, как это сделать.
Простой пример: я просто пытаюсь создать двухмерную прямоугольную сетку точек и нанести их на график.
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