Python: как скопировать одну и ту же строку матрицы? - PullRequest
0 голосов
/ 09 ноября 2018

Как я могу скопировать каждую строку массива n раз?

Так что, если у меня есть массив 2x3, и я копирую каждую строку 3 раза, у меня будет массив 6x3. Например, мне нужно конвертировать A в B ниже:

A = np.array([[1, 2, 3],
              [4, 5, 6]])

B = np.array([[1, 2, 3],
              [1, 2, 3],
              [1, 2, 3],
              [4, 5, 6],
              [4, 5, 6],
              [4, 5, 6]])

Если возможно, я бы хотел избежать петли for.

Ответы [ 4 ]

0 голосов
/ 11 ноября 2018

np.repeat это именно то, что вы ищете. Вы можете использовать опцию axis, чтобы указать, что вы хотите дублировать строки.

B = np.repeat(A, 3, axis=0)

0 голосов
/ 09 ноября 2018

Если я правильно прочитал, это, вероятно, то, что вы хотите, если вы начали с mat:

transformed = np.concatenate([np.vstack([mat[:, i]] * 3).T for i in range(mat.shape[1])], axis=1)

Вот проверяемый пример:

# mocking a starting array
import string
mat = np.random.choice(list(string.ascii_lowercase), size=(5,3))

>>> mat
array([['s', 'r', 'e'],
       ['g', 'v', 'c'],
       ['i', 'b', 'd'],
       ['f', 'g', 's'],
       ['o', 'm', 'w']], dtype='<U1')

Преобразуйте это:

# this repeats it 3 times for sake of displaying
transformed = np.concatenate([np.vstack([mat[i, :]] * 3).T for i in range(mat.shape[0])], axis=1).T

>>> transformed
array([['s', 'r', 'e'],
   ['s', 'r', 'e'],
   ['s', 'r', 'e'],
   ['g', 'v', 'c'],
   ['g', 'v', 'c'],
   ['g', 'v', 'c'],
   ['i', 'b', 'd'],
   ['i', 'b', 'd'],
   ['i', 'b', 'd'],
   ['f', 'g', 's'],
   ['f', 'g', 's'],
   ['f', 'g', 's'],
   ['o', 'm', 'w'],
   ['o', 'm', 'w'],
   ['o', 'm', 'w']], dtype='<U1')

Идея этого состоит в том, чтобы использовать vstack для объединения каждого столбца с самим собой несколько раз, а затем объединить результат этого для получения окончательного массива.

0 голосов
/ 10 ноября 2018

Вы можете использовать np.repeat с целочисленной позиционной индексацией:

B = A[np.repeat(np.arange(A.shape[0]), 3)]

array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3],
       [4, 5, 6],
       [4, 5, 6],
       [4, 5, 6]])
0 голосов
/ 09 ноября 2018
v1=[3,2]
v3=v1[:]*10
print(v3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...