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

С помощью numpy.broadcst-array вводится идиома.Тем не менее, идиома дает точно такой же вывод, как и оригинальная команда.Что означает «получение смежных копий вместо несмежных представлений»?просмотров.

[np.array(a) for a in np.broadcast_arrays(x, y)]

[array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]]), array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])]

Ответы [ 2 ]

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

Это означает, что функция broadcast_arrays не создает совершенно новый объект.Он создает представления из исходных массивов, что означает, что элементы его результатов имеют адреса памяти как те массивы, которые могут быть или не быть смежными.Но когда вы создаете список, вы создаете новые копии в списке, который гарантирует, что его элементы хранятся непрерывно в памяти.

Вы можете проверить это следующим образом:

arr = np.broadcast_arrays(x, y)
In [144]: arr
Out[144]: 
[array([[1, 2, 3],
        [1, 2, 3],
        [1, 2, 3]]), array([[1, 1, 1],
        [2, 2, 2],
        [3, 3, 3]])]

In [145]: x
Out[145]: array([[1, 2, 3]])

In [146]: arr[0][0] = 0

In [147]: arr
Out[147]: 
[array([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]]), array([[1, 1, 1],
        [2, 2, 2],
        [3, 3, 3]])]

In [148]: x
Out[148]: array([[0, 0, 0]])

Как вывидите, изменение элементов arr приводит к изменению как его элементов, так и исходного массива x.

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

Чтобы понять разницу, попробуйте записать в новые массивы:

Давайте начнем с непрерывных копий.

>>> import numpy as np
>>> x = np.array([[1,2,3]])
>>> y = np.array([[1],[2],[3]])
>>> 
>>> xc, yc = [np.array(a) for a in np.broadcast_arrays(x, y)]
>>> xc
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])

Мы можем изменить элемент, и ничего неожиданного не произойдет.

>>> xc[0, 0] = 0
>>> xc
array([[0, 2, 3],
       [1, 2, 3],                                                                                                   
       [1, 2, 3]])
>>> x
array([[1, 2, 3]])

Теперь давайте попробуем то же самое с широковещательными массивами:

>>> xb, yb = np.broadcast_arrays(x, y)
>>> xb
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])

Хотя мы пишем только в верхний левый элемент ...

>>> xb[0, 0] = 0

...весь левый столбец изменится ...

>>> xb
array([[0, 2, 3],
       [0, 2, 3],
       [0, 2, 3]])

..., а также входной массив.

>>> x
array([[0, 2, 3]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...