2016-09-27 2 views
1

У меня есть Numpy массив сказатьДублирование элементов в Numpy массиве

a = array([[1, 2, 3], 
      [4, 5, 6], 
      [7, 8, 9]]) 

У меня есть массив «репликацию» одного и того же размера, где репликация [I, J] (> = 0) обозначает, сколько раз [ i] [j] следует повторять вдоль строки. Обидно, массив репликации следует за инвариантом, что np.sum (replication [i]) имеет одинаковое значение для всех i. Например, если

replication = array([[1, 2, 1], 
        [1, 1, 2], 
        [2, 1, 1]]) 

тогда конечный массив после тиражирования является:

new_a = array([[1, 2, 2, 3], 
      [4, 5, 6, 6], 
      [7, 7, 8, 9]]) 

В настоящее время я делаю это, чтобы создать new_a:

##allocate new_a 
h = a.shape[0] 
w = a.shape[1] 
for row in range(h): 
     ll = [[a[row][j]]*replicate[row][j] for j in range(w)] 
     new_a[row] = np.array([item for sublist in ll for item in sublist]) 

Однако, это, кажется, слишком медленный, поскольку он включает использование списков. Могу ли я сделать целиком в numpy, без использования списков python?

ответ

3

Вы можете выравнивать свой replication массив, а затем использовать .repeat() метод a:

import numpy as np 

a = array([[1, 2, 3], 
      [4, 5, 6], 
      [7, 8, 9]]) 

replication = array([[1, 2, 1], 
        [1, 1, 2], 
        [2, 1, 1]]) 

new_a = a.repeat(replication.ravel()).reshape(a.shape[0], -1) 

print(repr(new_a)) 
# array([[1, 2, 2, 3], 
#  [4, 5, 6, 6], 
#  [7, 7, 8, 9]]) 
+0

Спасибо, используя только NumPy является порядок величин быстрее, чем взаимодействие со списками. –