работа с парами столбцов в R (или numpy)

#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 , будет быстрее, так как вы можете уменьшить количество сравнений