Использование карты, когда функция, в которой используется карта, имеет массивы входных данных - PullRequest
1 голос
/ 06 мая 2019

Функция Джулии «высшего порядка» «карта» выглядит очень полезной. Но хотя легко понять, как его можно использовать в функциях с одним входом, не совсем понятно, как можно использовать map, когда функция имеет несколько входов, и когда каждый из них может быть массивом. Я хотел бы узнать, как карта используется в этой ситуации.

Предположим, у меня есть следующая функция:

function randomSample(items, weights)
sample(items, Weights(weights))
end

Пример:

Pkg.add("StatsBase")
using StatsBase
randomSample([1,0],[0.5, 0.5])

Как карту можно использовать здесь? Я пробовал что-то вроде:

items = [1 0;1 0;1 0]
weights = [1 0;0.5 0.5;0.75 0.25]

map(randomSample(items,weights))  

В приведенном выше примере я ожидаю, что Джулия выведет массив целых чисел 3 на 1 (из элементов), каждая строка будет либо 0, либо 1, в зависимости от соответствующих весов.

1 Ответ

3 голосов
/ 06 мая 2019

В вашем случае, когда items и weights равны Matrix, вы можете использовать функцию eachrow следующим образом:

map(randomSample, eachrow(items), eachrow(weights))

Если вы используете версию Julia ранее 1.1, вы можете написать:

map(i -> randomSample(items[i, :], weights[i, :]), axes(items, 1))

или

map(i -> randomSample(view(items,i, :), view(weights, i, :)), axes(items, 1))

(последний избегает выделения)

Однако на практике я, вероятно, определил бы items и weights как векторы векторов:

items = [[1, 0],[1, 0],[1, 0]]
weights = [[1, 0], [0.5, 0.5], [0.75, 0.25]]

и тогда вы можете просто написать:

map(randomSample, items, weights)

или

randomSample.(items, weights)

Причина моего предпочтения заключается в следующем:

  • концептуально понятно, какова структура ваших данных
  • вектор векторов легче мутировать (например, вы можете push! новую запись в конце)
  • вектор векторов может быть разорван при необходимости
  • в некоторых случаях это может быть немного быстрее (итерация по строкам в Julia не оптимальна, поскольку она использует индексацию по главному столбцу; конечно, вы можете исправить это в своем подходе Matrix, предполагая, что вы храните данные не по столбцам colwise, как вы в настоящее время)

(это не очень сильное предпочтение, и вы, вероятно, можете выбрать то, что вам удобнее)

...