Вычислить все возможные разности столбцов в матрице

Я хотел бы вычислить все возможные парные различия (без повторения) между столбцами матрицы. Каков эффективный / питонический способ сделать это?

mat = np.random.normal(size=(10, 3)) mat array([[ 1.57921282, 0.76743473, -0.46947439], [ 0.54256004, -0.46341769, -0.46572975], [ 0.24196227, -1.91328024, -1.72491783], [-0.56228753, -1.01283112, 0.31424733], [-0.90802408, -1.4123037 , 1.46564877], [-0.2257763 , 0.0675282 , -1.42474819], [-0.54438272, 0.11092259, -1.15099358], [ 0.37569802, -0.60063869, -0.29169375], [-0.60170661, 1.85227818, -0.01349722], [-1.05771093, 0.82254491, -1.22084365]]) 

В этой матрице имеется 3 попарных разности (N выбирает k уникальных комбинаций, где порядок не имеет значения).

 pair_a = mat[:, 0] - mat[:, 1] pair_b = mat[:, 0] - mat[:, 2] pair_c = mat[:, 1] - mat[:, 2] 

является одним (уродливым) способом. Вы можете легко представить, используя вложенные for петель для больших матриц, но я надеюсь, что есть более хороший способ.

Я хотел бы, чтобы результат был другой матрицей, с scipy.misc.comb(mat.shape[1], 2) столбцами и mat.shape[0] строк.

3 Solutions collect form web for “Вычислить все возможные разности столбцов в матрице”

Комбинации длины 2 можно найти, используя следующий трюк:

 N = mat.shape[1] I, J = np.triu_indices(N, 1) result = mat[:,I] - mat[:,J] 
 In [7]: arr = np.arange(m*n).reshape((m, n)) In [8]: arr Out[8]: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19]]) In [9]: from itertools import combinations In [10]: def diffs(arr): ....: arr = np.asarray(arr) ....: n = arr.shape[1] ....: for i, j in combinations(range(n), 2): ....: yield arr[:, i] - arr[:, j] ....: In [11]: for x in diffs(arr): print x [-1 -1 -1 -1 -1] [-2 -2 -2 -2 -2] [-3 -3 -3 -3 -3] [-1 -1 -1 -1 -1] [-2 -2 -2 -2 -2] [-1 -1 -1 -1 -1] 

Если вам нужны они в массиве, то просто предопределите массив и назначьте строки (или столбцы, по желанию).

Кстати, вот решение, которое я придумал. Гораздо менее элегантно, чем moarningsun's.

 def pair_diffs(mat): n_pairs = int(sp.misc.comb(mat.shape[1], 2)) pairs = np.empty([mat.shape[0], n_pairs]) this_pair = 0 # compute all differences: for i in np.arange(mat.shape[1]-1): for j in np.arange(i+1, mat.shape[1]): pairs[:, this_pair] = mat[:, i] - mat[:, j] this_pair += 1 return pairs 
  • Оценить выражение sympy из массива значений
  • Python / Numpy MemoryError
  • scipy.spatial.ckdtree работает медленно
  • Создание регулярной сетки Delaunay в scipy
  • Чтение файлов .mat в Python
  • Вейвлет-сюжет с библиотеками Python
  • Производительность между операциями массива C-смежных и Fortran-смежных
  • Я знаю, scipy curve_fit может сделать лучше
  • Полосовой фильтр в питоне
  • scipy.sparse dot чрезвычайно медленный в Python
  • точки сортировки для формирования непрерывной линии
  • Python - лучший язык программирования в мире.