multiply () в numpy питоне - PullRequest
       3

multiply () в numpy питоне

2 голосов
/ 29 ноября 2011

Мне кажется, есть две версии функции numpy multiply():

  1. c = multiply( a, b )
  2. multiply(a, b, c )

У меня два вопроса:

  1. В чем разница между двумя версиями?
  2. Мне нужно использовать dot() функцию, и я знаю, c = dot( a, b) работает. Но dot(a, b, c) нет.

Ответы [ 2 ]

6 голосов
/ 29 ноября 2011
  1. Разница между двумя версиями multiply():

    c = multilpy(a, b)
    

    умножает массивы a и b поэлементно, создавая new массив как результат.Имя c связано с этим новым массивом.Если c ранее указывал на другой массив, это могло или не могло инициировать сборку мусора для массива, на который c указывал ранее, в зависимости от того, существуют ли другие ссылки на этот массив.

    multilpy(a, b, c)
    

    умножаетмассивы a и b поэлементно сохраняют результат в существующем массиве c (который должен иметь подходящие размеры).Новый объект массива не создается, а изменяется существующий массив.Помимо различной семантики, этот вариант быстрее, если c уже указывает на массив подходящего типа и размера, поскольку новый массив не выделяется.Этот вариант также может уменьшить использование памяти.

  2. На самом деле это не вопрос.Да, dot() не имеет формы с тремя параметрами.Это не уфунк и он не следует обычным правилам вещания - он не может из-за семантики точечного продукта.

    Редактировать : начиная с NumPy 1.6, dot() на самом деле имеет трехпараметрическую форму с семантикой, подобной описанной выше.(Для чего это стоит, это все еще не ufunc.)

1 голос
/ 29 ноября 2011

Существует только одна версия всех стандартных numpy ufuncs - используя точку в качестве примера

Type:           builtin_function_or_method
Base Class:     <type 'builtin_function_or_method'>
String Form:    <built-in function dot>
Namespace:      Interactive
Docstring:
    dot(a, b, out=None)

Dot product of two arrays.

For 2-D arrays it is equivalent to matrix multiplication, and for 1-D
arrays to inner product of vectors (without complex conjugation). For
N dimensions it is a sum product over the last axis of `a` and
the second-to-last of `b`::

    dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])

Parameters
----------
a : array_like
    First argument.
b : array_like
    Second argument.
out : ndarray, optional
    Output argument. This must have the exact kind that would be returned
    if it was not used. In particular, it must have the right type, must be
    C-contiguous, and its dtype must be the dtype that would be returned
    for `dot(a,b)`. This is a performance feature. Therefore, if these
    conditions are not met, an exception is raised, instead of attempting
    to be flexible.

Если вы предоставите опциональному третьему агрументу правильный тип d и порядок хранения, он будет работать:

In [78]: a=np.array([1.,2.,3.,4.])

In [79]: b=np.diag(a)

In [80]: c=np.empty_like(a)

In [81]: np.dot(a,b,c)
Out[81]: array([  1.,   4.,   9.,  16.])

In [82]: np.dot(a,b)
Out[82]: array([  1.,   4.,   9.,  16.])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...