Вы можете напрямую использовать x, y и z для восстановления вашей маски. Сначала используйте новый массив той же формы, что и ваша маска. Я предварительно заполнил все нулями (т. Е. False
). Затем установите для каждой координаты, определенной x, y и z, значение True
:
new_mask = np.zeros_like(mask)
new_mask[x,y,z] = True
# Check if mask and new_mask is the same
np.allclose(mask, new_mask)
# True
Если вы спросите, можете ли вы восстановить свою маску только , зная x, y и z, это невозможно. Потому что вы теряете информацию о том, что не заполнено. Просто представьте, что ваш эллипсоид находится в углу огромного куба. Как бы вы узнали (только зная, как выглядит эллипсоид), насколько велик куб?
Относительно вашего второго вопроса:
Вы должны исправить свои координаты, потому что они могут быть вне вашего пейзажа. Итак, я определил функцию, которая позаботится об этом:
def fixCoordinates(coord, shape):
# move to the positive edge
# remove negative indices
# you can also add now +1 to
# have a margin around your ellipse
coord -= coord.min(0)
# trim coordinates outside of scene
for i, s in enumerate(shape):
coord[coord[:,i] >= s] = s-1
# Return coordinates and change dtype
return coord.astype(np.int)
И если вы немного измените свой код, вы можете использовать ту же стратегию, что и раньше:
# your code
import quaternion
angle1 = 90
rotation = np.exp(quaternion.quaternion(0,0, 1) * angle1*(np.pi/180) / 2)
coord_rotd = quaternion.rotate_vectors(rotation, coord_rotd)
# Create new mask
new_mask2 = np.zeros_like(new_mask)
# Fix coordinates
coord_rotd = fixCoordinates(coord_rotd, mask.shape)
x1 = coord_rotd[:,0]
y1 = coord_rotd[:,1]
z1 = coord_rotd[:,2]
# create new mask, similar as before
new_mask2[x1, y1, z1] = True
Учитывая ваш пример поворота, теперь вы можете строить обе маски (одинаковой формы) бок о бок: