Индексация в Юлии

я хочу установить (1,1),(2,1),(3,3) элемент матрицы A равен 1.

В Python я могу сделать что-то вроде.

A=zeros(Int,4,4)
A[[1,2,3],[1,1,3]]=1

Это не работает. Что такое эквивалент в Джулии?

это явно не то, о чем я спрашиваю. Я хочу, чтобы конкретный элемент был 1, а не все.

Tom 02.09.2024 14:27
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
1
51
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Насколько я могу судить, Джулия не поддерживает один и тот же стиль одновременного множественного расширенного индексирования для назначения. Итак, вам может потребоваться использовать цикл for для достижения желаемого результата:

julia> A = zeros(Int, 4, 4)
4×4 Matrix{Int64}:
 0  0  0  0
 0  0  0  0
 0  0  0  0
 0  0  0  0

julia> idx = [(1, 1), (2, 1), (3, 3)]
3-element Vector{Tuple{Int64, Int64}}:
 (1, 1)
 (2, 1)
 (3, 3)

julia> for (i, j) in idx
           A[i, j] = 1
       end

julia> A
4×4 Matrix{Int64}:
 1  0  0  0
 1  0  0  0
 0  0  1  0
 0  0  0  0

Спасибо за ответ, это не совсем то, что я хотел. Я изменил один из индексов в вопросе на (3,3).

Tom 02.09.2024 14:56

Понятно, в Джулии этого сделать невозможно. Но, возможно, кто-то другой ответит.

Sash Sinha 02.09.2024 15:14

Спасибо, да, я думаю, это единственный способ сделать это... Я приму ваш ответ.

Tom 02.09.2024 16:45

Следующее работает (хотя цикл for, вероятно, будет более эффективным). A[CartesianIndex.([(1,1), (2,1), (3,3)])] .= 1

Или A[CartesianIndex.(zip([1,2,3], [1,1,3]))] .= 1; A

Следующее согласуется с замечанием Оскара Смитса о вероятной эффективности производительности.

# Julia 1.10.5
using BenchmarkTools

A = zeros(Int64, 100, 100)
xs = [rand(1:100) for x in 1:100]
ys = [rand(1:100) for y in 1:100]
zs = zip(xs, ys)

@btime ($A)[CartesianIndex.(zip($xs,$ys))] .= 1; nothing
# ... ns (2 allocations: 3.58 KiB)

@btime ($A)[CartesianIndex.($zs)] .= 1; nothing
# ... ns (2 allocations: 3.58 KiB)

@btime for (x, y) in zip($xs, $ys); ($A)[x,y] = 1; end
# ... ns (0 allocations: 0 bytes)

@btime for (x, y) in $zs; ($A)[x,y] = 1; end
# ... ns (0 allocations: 0 bytes)

Другие вопросы по теме