Удалить 2d срез из массива 3d numpy - PullRequest
4 голосов
/ 07 октября 2019

Мне нужно удалить последние массивы из трехмерного кубика. У меня есть:

a = np.array(
[[[1,2,3],
 [4,5,6],
 [7,8,9]],

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

[[0,0,0],
 [0,0,0],
 [0,0,0]],

[[0,0,0],
 [0,0,0],
 [0,0,0]]])

Как удалить массивы с нулевыми подмассивами, как в нижней части куба, используя np.delete?

(я не могу просто удалить все нулизначения, потому что в данных на верхней стороне будут нули)

Ответы [ 5 ]

4 голосов
/ 07 октября 2019

Для трехмерного куба вы можете проверить all по двум последним осям

a = np.asarray(a)
a[~(a==0).all((2,1))]

array([[[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]],

       [[9, 8, 7],
        [6, 5, 4],
        [3, 2, 1]]])
2 голосов
/ 07 октября 2019

Вот один из способов удалить конечные срезы всех нулей, как уже упоминалось в вопросе о том, что мы хотим сохранить все срезы нулей в данных на верхней стороне -

a[:-(a==0).all((1,2))[::-1].argmin()]

Пример выполнения -

In [80]: a
Out[80]: 
array([[[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

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

       [[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]]])

In [81]: a[:-(a==0).all((1,2))[::-1].argmin()]
Out[81]: 
array([[[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[9, 8, 7],
        [6, 5, 4],
        [3, 2, 1]]])
1 голос
/ 07 октября 2019

Если вы знаете, где они уже находятся, проще всего их нарезать:

a[:-2]

Результат:

array([[[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]],

       [[9, 8, 7],
        [6, 5, 4],
        [3, 2, 1]]])
0 голосов
/ 07 октября 2019

Используйте любой и выберите:)

a=np.array([[[1,2,3],
 [4,5,6],
 [7,8,9]],

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

[[0,0,0],
 [0,0,0],
 [0,0,0]],

[[0,0,0],
 [0,0,0],
 [0,0,0]]])
a[a.any(axis=2).any(axis=1)]
0 голосов
/ 07 октября 2019

Надеюсь, это поможет,

a_new=[] #Create a empty list
for item in a:
        if not (np.count_nonzero(item) == 0): #check if inner matrix is empty or not
            a_new.append(item) #appending to inner matrix to the list

a_new=np.array(a_new) #creating numpy matrix with removed zero elements

Вывод:

array([[[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]],

       [[9, 8, 7],
        [6, 5, 4],
        [3, 2, 1]]])
...