Список списков, заполненных элементами / строками списка, вычтенного друг из друга - PullRequest
0 голосов
/ 17 ноября 2018

Итак, у меня есть список Nx1, где каждая строка (i->I) должна быть вычтена из всех других элементов, образующих список, тогда этот список должен быть частью другого спискакоторый содержит I строк.В настоящее время я делаю это с помощью цикла, но мне было интересно, можно ли с помощью широковещания убрать требование к циклам, например, как работает pdist / cdist в scipy.

Например:

An input matrix of: [1,2,4,7,9] 
should result in: [[0,1,3,6,8],[-1,0,2,5,7],[-3,-2,0,3,5],[-6,-5,-3,0,2],[-8,-7,-5,-2]]

Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Если a - это numpy.array, то самое простое решение - использовать numpy.newaxis:

>>> a=numpy.array([1,2,4,7,9])
>>> a-a[:,numpy.newaxis]
array([[ 0,  1,  3,  6,  8],
       [-1,  0,  2,  5,  7],
       [-3, -2,  0,  3,  5],
       [-6, -5, -3,  0,  2],
       [-8, -7, -5, -2,  0]])
0 голосов
/ 17 ноября 2018

Конечно, есть более хорошие способы написать это с помощью numpy, но это способ сделать это:

import numpy as np

input = [1,2,4,7,9]

m = np.array(input * len(input)).reshape(len(input), len(input))
m - np.array(input).reshape(len(input), 1)

# array([[ 0,  1,  3,  6,  8],
#        [-1,  0,  2,  5,  7],
#        [-3, -2,  0,  3,  5],
#        [-6, -5, -3,  0,  2],
#        [-8, -7, -5, -2,  0]])
...