Преобразование массива CartesianIndex в 2D-матрицу в Julia с использованием as_ints - PullRequest
0 голосов
/ 27 марта 2019

Я пишу программу для извлечения определенных элементов из массива типа Array {Union {Missing, Float64}, 2} using findall; findall возвращает переменную Array {CartesianIndex {2}, 1}; .

Я пытаюсь преобразовать эту переменную в стандартную матрицу, используя as_ints, как описано в: https://stackoverflow.com/a/54300691/9130305

Я получаю сообщение об ошибке:

ОШИБКА: UndefVarError: as_ints не определены

Эта функция все еще существует в Julia версии 1.1.0? Если ДА, как я могу это использовать? Спасибо за вашу помощь.

Я использую Julia в Atom на MacBook Pro

Код, который я использую ...

indices = findall(x -> x == 4000,data);

ind = as_ints(indices);

...

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Кажется, вы говорите, что хотите извлечь элементы из матрицы, используя findall. Если я не пойму неправильно, вам не нужно для преобразования CartesianIndex в массив. Просто используйте их напрямую, чтобы получить элементы. Например:

A = rand(5, 4) # source array
f = x -> x >= 0.7 # filtering function
ind = findall(f, A)  # returns vector of CartesianIndex
elements = A[ind]  # retrieve elements

Не нужно конвертировать, вот что CartesianIndex равно для .

Кроме того, вы можете использовать логическое индексирование для получения элементов:

elements = A[f.(A)]

или фильтрация:

elements = filter(f, A)

или понимание:

elements = [a for a in A if f(a)]

Что касается функции to_ints из связанного поста, которой никогда не было в Юлии. Эту функцию постер определил прямо в посте, чтобы показать, как это можно сделать. Но я подозреваю, что вам это вообще не нужно.

0 голосов
/ 27 марта 2019

Я не уверен, что именно вы хотите получить, но это, вероятно, то, что вы ищете:

julia> x = rand(5,5)
5×5 Array{Float64,2}:
 0.162856  0.19944   0.497173  0.644154  0.0535536
 0.249625  0.86901   0.451791  0.614897  0.185165
 0.674177  0.995515  0.261636  0.705788  0.410553
 0.029235  0.743839  0.672526  0.489376  0.0748679
 0.980195  0.892695  0.531932  0.493069  0.683519

julia> c = findall(t->t<0.5, x)
13-element Array{CartesianIndex{2},1}:
 CartesianIndex(1, 1)
 CartesianIndex(2, 1)
 CartesianIndex(4, 1)
 CartesianIndex(1, 2)
 CartesianIndex(1, 3)
 CartesianIndex(2, 3)
 CartesianIndex(3, 3)
 CartesianIndex(4, 4)
 CartesianIndex(5, 4)
 CartesianIndex(1, 5)
 CartesianIndex(2, 5)
 CartesianIndex(3, 5)
 CartesianIndex(4, 5)

julia> getindex.(c, [1 2])
13×2 Array{Int64,2}:
 1  1
 2  1
 4  1
 1  2
 1  3
 2  3
 3  3
 4  4
 5  4
 1  5
 2  5
 3  5
 4  5

Короче говоря - вы можете транслировать getindex по вектору CartesianIndex записей и выбирать в столбцах индексы, которые хотите получить.

Это то, что вы ищете?

(и это по сути то же самое, что написал crstnbr в Преобразование массива CartesianIndex в 2D-матрицу в Julia , как я вижу сейчас)

...