Я надеюсь написать функцию 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.]])
Кажется, что это работает, но также кажется очень неэффективным, поскольку я имею дело с аудиоданными, поэтому их размер довольно велик.
Пожалуйста, посоветуйте, если есть более питонский или простой способ эффективно вставить несоответствующий размер массива в другой массив.