Я сделал небольшой тестовый скрипт с указанным вами размером. На моем компьютере создание массива (ошибка памяти, если значение float, поэтому логические значения) и выбор медленны, но поиск нулей кажется довольно быстрым:
if __name__ == '__main__':
arr = np.ones((1756020, 28, 28, 4), dtype=bool)
for i in range(0,1756020,2):
arr[i] = 0
print(arr[:5])
s = arr.shape
t0 = time.time()
arr2 = arr.reshape((s[0], np.prod(s[1:])))
ok = np.any(arr2, axis=1)
print(time.time()-t0)
arr_clean = arr2[ok]
print(time.time()-t0)
arr_clean = arr_clean.reshape((np.sum(ok), *s[1:]))
print(time.time()-t0)
print('end')
Выход:
0.4846000671386719 # Быстрый поиск нулей
29.750200271606445 # Удаление нулей происходит медленно
29.797000408172607 # Преобразовать в исходную форму [1:] быстро