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

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

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 
  • Как вычислить scipy разреженный матричный определитель, не превращая его в плотный?
  • scipy.sparse dot чрезвычайно медленный в Python
  • Почему NumPy и SciPy имеют много одинаковых функций? Что я должен предпочесть?
  • Определение логнормального распределения с использованием Scipy vs Matlab
  • Объем выпуклого корпуса с QHull от SciPy
  • Предоставляет ли pandas / scipy / numpy функцию кумулятивного стандартного отклонения?
  • Передача функции python на массивы numpy
  • Эффективный способ подсчета уникальных элементов в массиве numpy / scipy в Python
  •  
    Interesting Posts for Van-Lav

    Python – это time.sleep (n) интенсивность процессора?

    Регулярное выражение для соответствия точке

    Войти на сайт, используя urllib2 – Python 2.7

    Сравните две даты в python и игнорируйте микросекунды

    Что ближайшего я могу вызвать для вызова функции Python с использованием другой версии Python?

    Метод квадратурного численного интегрирования Tanh-sinh, сходящийся к неправильному значению

    Как сохранить меньшее значение на гистограмме спереди (когда я не могу разместить бары рядом)?

    Разница между последовательными элементами в списке

    Хранение вычисленных значений в объекте

    Текст Python для речи на Macintosh

    Конкретная причина, по которой python использует тройные кавычки для комментариев?

    Как обращаться с “ с открытым (…) `и` sys.stdout` красиво?

    Где я могу найти файл bashrc на Mac?

    Передача нескольких параметров функции pool.map () в Python

    Как проверить поля wtforms друг против друга?

    Python - лучший язык программирования в мире.