Подход № 1
Мы могли бы использовать широковещательное присвоение массива для векторизованного решения -
def array_assign(items):
L = 48 # slice at this column ID
N = items.shape[-1]
out = np.empty(shape= items.shape[:2] + (L,N-L+1), dtype=np.float32)
out[...,1:] = items[...,None,L:]
out[...,0] = items[...,:L]
return out
Подход № 2
Мы могли бы также использовать широковещательный просмотр и затем объединить -
def broadcast_concat(items):
L = 48 # slice at this column ID
N = items.shape[-1]
a = items[...,:L,None]
shp_b = items.shape[:2] + (L,N-L)
b = np.broadcast_to(items[...,None,L:],shp_b)
out = np.concatenate((a,b),axis=-1)
return out
Время -
In [321]: items = np.random.rand(5,367,60)
In [322]: %timeit array_assign(items)
1000 loops, best of 3: 923 µs per loop
In [323]: %timeit broadcast_concat(items)
1000 loops, best of 3: 781 µs per loop
Для честного сравнения, мы должны были бы позволить второму методу использовать более эффективныйfloat32
dtype также.Давайте используем этот dtype для настройки входных данных и снова протестируем -
In [335]: items = np.random.rand(5,367,60).astype(np.float32)
In [336]: %timeit array_assign(items)
1000 loops, best of 3: 897 µs per loop
In [337]: %timeit broadcast_concat(items)
1000 loops, best of 3: 348 µs per loop
Итак, для наиболее производительного случая для случая, когда требуется преобразование dtype, мы могли бы использовать items = np.asarray(items, dtype=np.float32)
в начале подхода# 2.