Преобразуйте однострочник из Numpy Python в Julia, который включает отображение одного 2D-массива на другой 2D-массив - PullRequest
2 голосов
/ 29 мая 2020

Юля новичок здесь. Мне нужно так немного подтасовать пару матриц. Моя цель такова:

Для определенной матрицы Matrix1 как:

enter image description here

и двоичной матрицы Matrix2 как это:

enter image description here

, я хочу выделить элементы из Matrix1 в Matrix2 так, чтобы у меня была окончательная матрица Matrix3, которая выглядит так:

enter image description here

В Python сработал следующий лайнер:

Matrix3= Matrix1.flatten()[(np.cumsum(Matrix2).reshape(Matrix2.shape)-1)] * Matrix2

Может ли кто-нибудь помочь мне в написании аналогичной статьи кода (желательно с одним лайнером) в Юлии?

Расширение - я получил ответ на вышеуказанный вопрос от @cbk. Как продолжение вопроса выше. Я думал об обобщении его для матриц более высокой размерности. Итак, предположим, что матрица Matrix1 имеет размерность (4,6,6), а двоичная матрица Matrix2 имеет размерность (4,12,12). Проблема распределения остается прежней. Как тогда вы подойдете к этому? Может ли кто-нибудь помочь мне в этом?

1 Ответ

2 голосов
/ 29 мая 2020

Основные "ошибки" заключаются в том, что (1) вы хотите заполнить Matrix3 соответствующим типом нуля и (2) Джулия является главным столбцом, поэтому вам нужно переставить. Это должно сработать:

(Matrix3 = zeros(eltype(Matrix1),size(Matrix2)))'[Matrix2'[:]] .= Matrix1'[:]

Аналогичным вариантом будет

(Matrix3 = zeros(eltype(Matrix1),size(Matrix2)))'[vec(Matrix2')] .= vec(Matrix1')

, но он был немного менее эффективным, чем выше, согласно измерениям @btime

изменить: если Matrix2 изначально содержит целые числа вместо логических, вам нужно будет преобразовать перед индексированием с помощью Matrix2, например:

(Matrix3 = zeros(eltype(Matrix1),size(Matrix2)))'[Bool.(Matrix2'[:])] .= Matrix1'[:]

...