Трансляция с использованием функции суммы numpy - PullRequest
0 голосов
/ 28 мая 2018

Я читал о вещании и пытался понять это с помощью функции суммы numpy.

Я создал две матрицы:

m1 = np.array([[1,2,3],[4,5,6]]) # 3X2
m2 = np.array([[1],[2]]) # 2X1

Когда я добавляю вышеупомянутые две как:

m1 + m2

трансляция выполняется как вектор столбца [1],[2] копирует себя равнымина количество столбцов внутри m1 матрицы.Можно ли посмотреть трансляцию, используя np.sum(m1,m2)?Я предполагаю, что нет никакой разницы между m1 + m2 и np.sum(m1,m2).Но в настоящее время np.sum(m1,m2) выдает ошибку TypeError: only integer scalar arrays can be converted to a scalar index.

Разве у меня не может быть numpy для вещания, если я использую его функцию sum?

Ответы [ 2 ]

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

Вы на самом деле можете сделать sum broadcast:

>>> import numpy as np
>>> 
>>> a, b, c = np.ogrid[:2, :3, :4]
>>> d = b*c
>>> list(map(np.shape, (a, b, c, d)))
[(2, 1, 1), (1, 3, 1), (1, 1, 4), (1, 3, 4)]
>>> 
>>> a+b+c+d
array([[[ 0,  1,  2,  3],
        [ 1,  3,  5,  7],
        [ 2,  5,  8, 11]],

       [[ 1,  2,  3,  4],
        [ 2,  4,  6,  8],
        [ 3,  6,  9, 12]]])
>>> np.sum([a, b, c, d])
array([[[ 0,  1,  2,  3],
        [ 1,  3,  5,  7],
        [ 2,  5,  8, 11]],

       [[ 1,  2,  3,  4],
        [ 2,  4,  6,  8],
        [ 3,  6,  9, 12]]])

Я подозреваю, что это создает 4-элементный массив объекта dtype, а затем делегирует фактическое суммирование массивам элементов.

К сожалению, фабрика array может порой капризничать с такими массивами массивов:

И, действительно, мы можем использовать пример, известный как разгром np.array, чтобы споткнуться np.sum, хотя фактическая ошибка не возникает в np.array:

>>> np.sum([np.arange(3), 1]) # fine
array([1, 2, 3])
>>> np.sum([1, np.arange(3)]) # ouch!
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/paul/lib/python3.6/site-packages/numpy/core/fromnumeric.py", line 1882, in sum
    out=out, **kwargs)
  File "/home/paul/lib/python3.6/site-packages/numpy/core/_methods.py", line 32, in _sum
    return umr_sum(a, axis, dtype, out, keepdims)
ValueError: setting an array element with a sequence.

Таким образом, в целом, вероятно, лучше использовать встроенный Python sum:

>>> sum([a, b, c, d])
array([[[ 0,  1,  2,  3],
        [ 1,  3,  5,  7],
        [ 2,  5,  8, 11]],

       [[ 1,  2,  3,  4],
        [ 2,  4,  6,  8],
        [ 3,  6,  9, 12]]])
>>> sum([1, np.arange(3)])
array([1, 2, 3])
>>> sum([np.arange(3), 1])
array([1, 2, 3])
0 голосов
/ 28 мая 2018

numpy.sum не добавляет два массива, он вычисляет сумму по одной (или нескольким, или, по умолчанию, всем) оси массива.Второй аргумент - это какая ось суммируется, и многомерный массив для этого не работает.

Это примеры того, как работает numpy.sum:

m1 = np.arange(12).reshape((3,4))
# sum all entries
np.sum(m1) # 66
# sum along the first axis, getting a result for each column
np.sum(m1, 0) # array([12, 15, 18, 21])

m2 = np.arange(12).reshape((2,3,2))
# sum along two of the three axes
m2.sum((1,2)) # array([15, 51])

Чем вы можете бытьищу это numpy.add.Это добавляет вместе два массива (точно так же как +), но позволяет добавить некоторые ограничения (при предоставлении ему массива out вы можете маскировать определенные поля, чтобы они не заполнились результатом добавления).В противном случае он ведет себя так, как вы ожидаете, если он будет знать правила простого вещания:

m1 = np.array([[1,2,3],[4,5,6]]) # 3X2
m2 = np.array([[1],[2]]) # 2X1
m1 + m2
# array([[2, 3, 4],
#        [6, 7, 8]])

np.add(m1, m2)
# array([[2, 3, 4],
#        [6, 7, 8]])

А вот пример более необычного использования:

m1 = m1.astype(float)
m1[1, 1] = np.inf
m1
# array([[  1.,   2.,   3.],
#        [  4.,  inf,   6.]])
out = np.zeros_like(m1)
where = np.ones_like(m1, dtype=bool)
where[1, 1] = False # don't want that infinity in the sum
np.add(m1, m2, out, where=where)
# array([[ 2.,  3.,  4.],
#        [ 6.,  0.,  8.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...