2015-10-01 3 views
1

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

Будучи немного многословным, функции Я ищу состоит в следующем:

a = np.random.rand(4,) 
b = np.random.rand(8,) 
c = np.tile(a,2) + b # this generate a memory copy anyhow 

Я хочу, чтобы избежать копирования памяти из np.tile.

Любая помощь приветствуется.

ответ

4
c = (b.reshape(2,4)+a).ravel() 

Reshape и усложнять оба мнения, так (я думаю) только новый массив производится путем суммирования. Фактически я меняю b на форму, которая может быть передана с помощью a.

Это значительно быстрее, даже в этой небольшой проблеме.


broadcast_array позволяет сделать вещательные шаги

In [506]: b1,a1 = np.broadcast_arrays(b.reshape(2,4),a) 

a1 вид, как показан буфером данных указателем

In [507]: a1.__array_interface__['data'] 
Out[507]: (164774704, False) 
In [508]: a.__array_interface__['data'] 
Out[508]: (164774704, False) 

СУММА

In [509]: a1+b1 
Out[509]: 
array([[ 2.04663934, 1.02951915, 1.30616273, 1.75154236], 
     [ 1.79237632, 1.08252741, 1.17031265, 1.2675438 ]]) 

a1 имеет, по сути, был черепичными без копирования

In [511]: a1.shape 
Out[511]: (2, 4) 
In [512]: a1.strides 
Out[512]: (0, 8) 

Посмотрите на np.lib.stride_tricks.py файл для более подробной информации о таком роде вещание. np.lib.stride_tricks.as_strided - основная функция, которая позволяет вам создавать представление с новой формой и шагами. Он чаще всего использовался на SO для создания скользящих окон.

+0

Хорошо! благодаря – Jake0x32

Смежные вопросы