#r #numpy #matrix
#r #numpy #матрица
Вопрос:
У меня есть две матрицы: A (k строк, m столбцов), B (k строк, n столбцов)
Я хочу работать со всеми парами столбцов (один из A и один из B), результатом должна быть матрица C (m строк, n столбцов), где C [i, j] = f(A [, i],B [, j]) теперь, если функция f было суммой скалярного произведения, тогда все это было просто простым умножением матриц (C = t (A) % *% B), но мое f отличается (в частности, я считаю количество равных записей:
f = function(x,y) sum(x==y)
мой вопрос, есть ли простой (и быстрый, потому что мои матрицы большие) способ вычисления результата?
предпочтительно на R, но возможно на python (numpy). Я думал об использовании outer(A,B,»==»), но это приводит к 4-мерному массиву, который я не понял, что именно с ним делать.
Любая помощь приветствуется
Ответ №1:
В R
, мы можем split
ввести их list
и применить функцию f
с вложенным lapply/sapply
lapply(asplit(A, 2), function(x) sapply(asplit(B, 2), function(y) f(x, y)))
Или использование outer
после преобразования в data.frame
, потому что единицей будет столбец, в то время как для matrix
, это один элемент (как matrix
и a vector
с dim
атрибутами)
outer(as.data.frame(A), as.data.frame(B), FUN = Vectorize(f))
данные
A <- cbind(1:5, 6:10)
B <- cbind(c(1:3, 1:2), c(5:7, 6:7))
Комментарии:
1. Опция mapply, похоже, не работает, она работает не со всеми комбинациями столбцов
2. @amit я думаю
combn
, будет быстрее, так как вы можете уменьшить количество сравнений