Самый эффективный способ взять предыдущие 70 значений из массива и поместить их в новое измерение - PullRequest
0 голосов
/ 05 марта 2020

Если быть более точным, я приведу пример, в настоящее время у меня есть 3D-матрица размеров 375 x 1226 x 64. Что мне нужно сделать, это изменить последнее измерение так, чтобы вместо 375 x 1226 x 64 у меня было 375 x 1226 x 70 x 64, где эти значения 70 x 64 взяты из предыдущих 70 значений.

Я реализовал это, но, к сожалению, это занимает слишком много времени:

    for i in range(0, old_mat.shape[0]):
        for j in range(0, old_mat.shape[1]):
            stop = j - 70 + 1
            if stop < 0:
                stop = 0
            temp = old_mat[i:i + 1, stop: j + 1].squeeze(0)
            new_mat[i][j][:temp.shape[0]] = temp

Править : скажем, 2d (3 x 4) массив:

[[1, 2, 5, 6], [2, 3, 3, 6], [3, 4, 5, 7]]

Теперь вместо 70, скажем, нам нужно около 3. В результате получается 3d (3 x 3 x 4):

[
 [[1,2,5,6],[0,0,0,0],[0,0,0,0]],
 [[2,3,3,6],[1,2,5,6],[0,0,0,0]],
 [[3,4,5,7],[2,3,3,6],[1,2,5,6]]
]

1 Ответ

0 голосов
/ 05 марта 2020
In [61]: arr = np.array([[1, 2, 5, 6], [2, 3, 3, 6], [3, 4, 5, 7]])                            
In [62]: arr1 = np.zeros((arr.shape[0],3,arr.shape[-1]),int)   

Достаточно перебрать первое измерение и скопировать фрагменты:

In [64]: for i in range(arr.shape[0]): 
    ...:     arr1[i,i:,:] = arr[:(3-i),:] 
    ...:                                                                                       
In [65]: arr1                                                                                  
Out[65]: 
array([[[1, 2, 5, 6],
        [2, 3, 3, 6],
        [3, 4, 5, 7]],

       [[0, 0, 0, 0],
        [1, 2, 5, 6],
        [2, 3, 3, 6]],

       [[0, 0, 0, 0],
        [0, 0, 0, 0],
        [1, 2, 5, 6]]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...