Нужен эффективный метод для трансляции меньшего массива Numpy в больший - PullRequest
2 голосов
/ 11 мая 2019

TL; DR: я ищу способ сократить следующий код без использования циклов

# x = [m, n] Numpy array
# y = [m, t*n] Numpy array of zeros (placeholder)
for i in range(m):
    for j in range(n):
        y[i, t*j:t*(j+1)] = x[i, j]

Более подробное объяснение: я хотел бы скопировать / передать двумерный массив в больший, который повторяет элементы t количество раз во втором измерении. Приведенный выше код работает нормально, хотя я хотел бы сохранить его эффективность, избегая использования циклов.

Ответы [ 2 ]

1 голос
/ 11 мая 2019
np.repeat(x,n,axis=1)

Это будет работать без инициализации нулевого массива!Предполагая, что вы просто хотите повторить предыдущий массив в столбцах.

0 голосов
/ 11 мая 2019

Если бы я дублировал вашу функцию, используя numpy, я сделал бы это:

import numpy as np

a = np.arange(float(m * n)).reshape(m, n)

def expand_array(a, t):
    m, n = a.shape
    return np.repeat(a[:, -1], t * n).reshape(m, t * n)

def op_func(a, t):
    m, n = a.shape
    y = np.zeros((m, n * t))
    for i in range(m):
        for j in range(n):
            y[i, :] = x[i, j]

    return y

(expand_array(a, 10) == op_func(a, 10)).all()

Вывод:

True

Однако, как я отметил в комментарии, этоэффективно пропускает каждый столбец, кроме последнего.Поэтому я подозреваю, что вы хотите что-то более похожее на одно из этих двух:

def repeat_expand_array(a, t):
    m, n = a.shape
    return np.repeat(a, t).reshape(m, t * n)

def tile_expand_array(a, t):
    m, n = a.shape
    return np.tile(a, t).reshape(m, t * n)

print(repeat_expand_array(a, 3), '\n')
print(tile_expand_array(a, 3))

Вывод:

[[0. 0. 0. 1. 1. 1.]
 [2. 2. 2. 3. 3. 3.]
 [4. 4. 4. 5. 5. 5.]] 

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