Есть ли лучший способ широковещательной передачи массивов?

Я хочу транслировать массив bв форму, которую он принял бы, если бы выполнял арифметическую операцию с другим массивом a.

Например, если a.shape = (3,3)и bбыли скаляром, я хочу получить массив, форма которого равна (3,3)и заполнена скаляром.

Один из способов сделать это так:

>>> import numpy as np
>>> a = np.arange(9).reshape((3,3))
>>> b = 1 + a*0
>>> b
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])

Хотя на практике это работает, я не могу не чувствовать, что это выглядит немного странно, и кому-то другому, глядя на код, не будет очевидно, что я пытаюсь сделать.

Есть ли более элегантный способ сделать это? Я просмотрел документацию по np.broadcast, но она на порядки медленнее.

In [1]: a = np.arange(10000).reshape((100,100))

In [2]: %timeit 1 + a*0
10000 loops, best of 3: 31.9 us per loop

In [3]: %timeit bc = np.broadcast(a,1);np.fromiter((v for u, v in bc),float).reshape(bc.shape)
100 loops, best of 3: 5.2 ms per loop

In [4]: 5.2e-3/32e-6
Out[4]: 162.5
6
задан ali_m 29 November 2015 в 18:00
поделиться