Как выполнить вставку массива, похожего на numpy.put, но изменить размер - PullRequest
0 голосов
/ 02 мая 2019

Я надеюсь написать функцию setitem, которая может заменить подмножество массива numpy другим массивом, который может иметь или не иметь одинаковую длину .shape [0] (но всегда одинаковый размер столбца .shape [1]]).

Например, использование numpy.put() будет привязано к форме массива.

a = np.arange(10)
np.put(a, [2,3], [80, 80, 80, 80])
array([ 0,  1, 80, 80,  4,  5,  6,  7,  8,  9])

Но я надеюсь расширить a до новой формы:

array([ 0,  1, 80, 80, 80, 80,  4,  5,  6,  7,  8,  9])

В данный момент я создал новый массив на основе новой формыбудет.Затем назначьте каждую часть соответствующим образом:

a = np.ones((10, 2)) * 2
b = np.ones((4, 2)) * 80

def insert(a, pos, b):
    start = pos[0]; end = start + b.shape[0]
    c = np.ndarray((b.shape[0] - len(pos) + a.shape[0], a.shape[1]))
    c[:start] = a[:start]  # The first part is still a
    c[start:end] = b       # The middle part being replace by b
    c[end:] = a[pos[-1] + 1:]  # The remaining is also a . 
    return c

a = insert(a, [2, 3], b) # Insert a longer to array to the position 
array([[ 2.,  2.],
       [ 2.,  2.],
       [80., 80.],
       [80., 80.],
       [80., 80.],
       [80., 80.],
       [ 2.,  2.],
       [ 2.,  2.],
       [ 2.,  2.],
       [ 2.,  2.],
       [ 2.,  2.],
       [ 2.,  2.]])

d = insert(a, [2,3,4,5,6], b)  # Insert a shorter array to the position
array([[ 2.,  2.],
       [ 2.,  2.],
       [80., 80.],
       [80., 80.],
       [80., 80.],
       [80., 80.],
       [ 2.,  2.],
       [ 2.,  2.],
       [ 2.,  2.]])

Кажется, что это работает, но также кажется очень неэффективным, поскольку я имею дело с аудиоданными, поэтому их размер довольно велик.

Пожалуйста, посоветуйте, если есть более питонский или простой способ эффективно вставить несоответствующий размер массива в другой массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...