Точечный продукт с поплавками во вложенных массивах - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь реализовать функцию точечного произведения, используя чистый базовый питон (без импорта или сторонние библиотеки).Я знаю, что для массива целых чисел я могу использовать следующую функцию:

def dot(v1, v2):
    return sum(x*y for x,y in zip(v1,v2))

Однако мои массивы являются числами с плавающей запятой:

lista = [[2.62, -3.97], [-2.32, -1.30], [-1.09, -0.45]]
listb = [-0.75, 2.75]

, и когда я пытаюсь print(dot(lista, listb)), я получаю:

TypeError: can't multiply sequence by non-int of type 'list'

Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Я подозреваю, что вы пришли из Matlab или подобного языка, где вещи, написанные для одного измерения, автоматически работают в более высоких измерениях.Это потому, что Matlab поддерживает то, что называется массивно-ориентированное программирование .Python не имеет этой возможности, поэтому вам придется обходить массив вручную.

map(lambda x: dot(x, listb), lista)
0 голосов
/ 27 мая 2018

Вам необходимо пройти один дополнительный уровень, чтобы выполнить умножения:

lista = [[2.62, -3.97], [-2.32, -1.30], [-1.09, -0.45]]
listb = [-0.75, 2.75]
final_results = [sum(a*b for a, b in zip(listb, i)) for i in lista]

Выход:

[-12.8825, -1.8350000000000004, -0.41999999999999993]

Или, используя функцию с map:

def dot(m, n = [-0.75, 2.75]):
  return sum(a*b for a, b in zip(m, n))

print(list(map(dot, lista)))
...