In Python I need to find the pairwise correlation between all features in a matrix A and all features in a matrix B. In particular, I am interesting in finding the strongest Pearson correlation that a given feature in A has across all features in B. I do not care whether the strongest correlation is positive or negative.
I've done a inefficient implementation using two loops and scipy below. However, I'd like to use np.corrcoef or another similar method to compute it efficiently. Matrix A has shape 40000x400 and B has shape 40000x1440. My attempt at doing it efficiently can be seen below as the method find_max_absolute_corr(A,B). However, it fails with the following error:
ValueError: all the input array dimensions except for the concatenation axis must match exactly.
import numpy as np
from scipy.stats import pearsonr
def find_max_absolute_corr(A, B):
    """ Finds for each feature in `A` the highest Pearson
        correlation across all features in `B`. """
    max_corr_A = np.zeros((A.shape[1]))    
    for A_col in range(A.shape[1]):
        print "Calculating {}/{}.".format(A_col+1, A.shape[1])
        metric = A[:,A_col]
        pearson = np.corrcoef(B, metric, rowvar=0)
        # takes negative correlations into account as well
        min_p = min(pearson)
        max_p = max(pearson)
        max_corr_A[A_col] = max_absolute(min_p, max_p)
    return max_corr_A
def max_absolute(min_p, max_p):
    if np.isnan(min_p) or np.isnan(max_p):
        raise ValueError("NaN correlation.")
    if abs(max_p) > abs(min_p):
        return max_p
    else:
        return min_p
if __name__ == '__main__':
    A = np.array(
        [[10, 8.04, 9.14, 7.46],
         [8, 6.95, 8.14, 6.77],
         [13, 7.58, 8.74, 12.74],
         [9, 8.81, 8.77, 7.11],
         [11, 8.33, 9.26, 7.81]])
    B = np.array(
        [[-14, -9.96, 8.10, 8.84, 8, 7.04], 
         [-6, -7.24, 6.13, 6.08, 5, 5.25], 
         [-4, -4.26, 3.10, 5.39, 8, 5.56], 
         [-12, -10.84, 9.13, 8.15, 5, 7.91], 
         [-7, -4.82, 7.26, 6.42, 8, 6.89]])
    # simple, inefficient method
    for A_col in range(A.shape[1]): 
        high_corr = 0
        for B_col in range(B.shape[1]):
            corr,_ = pearsonr(A[:,A_col], B[:,B_col])
            high_corr = max_absolute(high_corr, corr)
        print high_corr
    # -0.161314601631
    # 0.956781516149
    # 0.621071009239
    # -0.421539304112        
    # efficient method
    max_corr_A = find_max_absolute_corr(A, B)
    print max_corr_A
    # [-0.161314601631,
    # 0.956781516149,
    # 0.621071009239,
    # -0.421539304112]  
