Попробуйте это: - это основной алгоритм.Я не совсем понимаю, какие стороны вы хотите извлечь из ваших примеров, но приведенный ниже алгоритм должен быть очень простым для изменения в соответствии с вашими потребностями
Примечание: Этот алгоритм извлекает CUBE, где все границы нулевых значений «удалены»,Таким образом, на каждой стороне куба есть какое-то значение! = 0
import numpy as np
# testing dataset
d = np.zeros(shape = [5,5,5])
# fill some values
d[3,2,1]=1
d[3,3,1]=1
d[1,3,1]=1
d[1,3,4]=1
# find indexes in all axis
xs,ys,zs = np.where(d!=0)
# for 4D object
# xs,ys,zs,as = np.where(d!=0)
# extract cube with extreme limits of where are the values != 0
result = d[min(xs):max(xs)+1,min(ys):max(ys)+1,min(zs):max(zs)+1]
# for 4D object
# result = d[min(xs):max(xs)+1,min(ys):max(ys)+1,min(zs):max(zs)+1,min(as):max(as)+1]
>>> result.shape
(3, 2, 4)
Случай 1:
d = np.zeros(shape = [5,5,5])
d[3,2,1]=1
# ... just one value
>>> result.shape # works
(1,1,1)
Случай 2: # ошибка, случай - только нули - полученное 3D не имеет измерений ->ошибка
d = np.zeros(shape = [5,5,5]) # no values except zeros
>>> result.shape
Traceback (most recent call last):
File "C:\Users\zzz\Desktop\py.py", line 7, in <module>
result = d[min(xs):max(xs)+1,min(ys):max(ys)+1,min(zs):max(zs)+1]
ValueError: min() arg is an empty sequence
РЕДАКТИРОВАТЬ: поскольку мое решение не получило достаточной любви и понимания, я приведу пример для тела 4-го измерения, где 3 измерения свободны для изображения, а в 4-м измерении хранятся изображения
import numpy as np
class ImageContainer(object):
def __init__(self,first_image):
self.container = np.uint8(np.expand_dims(np.array(first_image), axis=0))
def add_image(self,image):
#print(image.shape)
temp = np.uint8(np.expand_dims(np.array(image), axis=0))
#print(temp.shape)
self.container = np.concatenate((self.container,temp),axis = 0)
print('container shape',self.container.shape)
# Create image container storage
image = np.zeros(shape = [5,5,3]) # some image
image[2,2,1]=1 # put something random in it
container = ImageContainer(image)
image = np.zeros(shape = [5,5,3]) # some image
image[2,2,2]=1
container.add_image(image)
image = np.zeros(shape = [5,5,3]) # some image
image[2,3,0]=1 # if we set [2,2,0] = 1, we can expect all images will have just 1x1 pixel size
container.add_image(image)
image = np.zeros(shape = [5,5,3]) # some image
image[2,2,1]=1
container.add_image(image)
>>> container.container.shape
('container shape', (4, 5, 5, 3)) # 4 images, size 5x5, 3 channels
# remove borders to all images at once
xs,ys,zs,zzs = np.where(container.container!=0)
# for 4D object
# extract cube with extreme limits of where are the values != 0
result = container.container[min(xs):max(xs)+1,min(ys):max(ys)+1,min(zs):max(zs)+1,min(zzs):max(zzs)+1]
>>> print('Final shape:',result.shape)
('Final shape', (4, 1, 2, 3)) # 4 images, size: 1x2, 3 channels