Другие дали ответы, которые помогут решить вашу проблему, поэтому я бы лучше просто рассмотрел ваш пример и попытался объяснить, что происходит. Ты выглядишь довольно разочарованным, что не редкость при изучении нового языка, но большинство твоих жалоб похоже на то, что Джулия последовательна.
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
Здесь вы создаете массив 10x10, где каждый элементматрица 1x2. Это то, что вы просите, это не Джулия, которая трудна или неясна, она просто последовательна и прямолинейна.
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]
У вас есть двумерный массив, поэтому вы не можете индексировать в нем 3 индекса.
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 :(
У вас есть массив 10x10 и попытайтесь преобразовать его в массив 100x2. В новом массиве будет 200 элементов, что в два раза больше исходного, поэтому это не сработает.
ps = reshape( ps, ( sh[1]*sh[2],:) )
# 100×1 Array{Array{Float64,2},2}
Здесь вы преобразуете его в массив 100x1, это нормально.
xs = ps[:,1]
# 100-element Array{Array{Float64,2},1}
# ??? WTF? ... this arrays looks like whole 'ps'
А теперь вы просите первый (и единственный) столбец нового, измененного ps
. Итак, естественно, вы получаете все данные. Обратите внимание, что xs
теперь является одномерным массивом, а не двумерным массивом 100x1.
ys = ps[:,2]
# ERROR: BoundsError: attempt to access 100×1 Array{Array{Float64,2},2} at index [Base.Slice(Base.OneTo(100)), 2]
Вы запрашиваете второй столбец массива 100x1.
xs = ps[:][1]
# 1×2 Array{Float64,2}:
# 0.1 0.1
# But I want all xs (ps[:,1]), not (ps[1,:])
ps[:]
превращает ps
в одномерный вектор с 100 элементами, а затем вы запрашиваете первый элемент этого. Мне кажется, ожидаемое поведение.
# Let's try some broadcasting
xs = ps.[1]
# ERROR: syntax: invalid syntax "ps.[1]"
Да, это не работает, и вполне разумно ожидать, что это возможно, но это возможная будущая функция. Возможно, вы ищете first.(ps)
, который читает первый элемент из каждого элемента ps
. Точно так же last.(ps)
читает последний элемент из каждого элемента ps
.
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
Не уверен, что вы хотите, чтобы здесь произошло. Transpose возвращает ленивый тип данных по соображениям производительности. Это довольно аккуратно.
scatter( ps[:,1], ps[:,2], markersize = 2, markerstrokewidth = 0, aspect_ratio=:equal )
# Nope
Насколько я помню, вы изменили ps
в массив 100x1, поэтому ps[:,2]
не может работать.