Что не так с размером массива numpy?
У меня учебное задание нарисовать с помощью OpenGL вращающийся по траекториям текст. Не стану приводить всего кода, связанного с отрисовкой сцены, поскольку ошибка в размерности массива. Также в скрипте использую модуль pygame.
Есть функция draw_text(text)
. Она принимает текст как аргумент и создает текстовую поверхность с помощью модуля pygame.font. Далее получает размеры этой поверхности (width
и height
) с помощью метода get_size. Затем функция проверяет, что ширина поверхности кратна 4. Если не кратна, то увеличивается до ближайшей кратной 4 ширины. После этого функция преобразует поверхность с помощью метода tostring() в строку байт и создает массив numpy с помощью метода frombuffer(). В конце функция преобразует массив в 3D-массив с размерами (width, height, 3)
и возвращает его. Для построения сцены 3D-массив в дальнейшем будет использоваться для сохранения текстуры, которая затем будет наложена на 3D-модель и отображена с помощью OpenGL.
Код:
# создание текста на поверхности
def draw_text(text):
font = pygame.font.Font(None, 36)
# создание поверхности с текстом
text_surface = font.render(text, True, (255, 255, 255), (0, 0, 0))
# получение параметров поверхности с текстом
width, height = text_surface.get_size()
# проверка, что ширина кратна 4
if width % 4 != 0:
width += 4 - (width % 4)
# преобразование поверхности с текстом в массив numpy
image_str = pygame.image.tostring(text_surface, 'RGB', True)
data = np.frombuffer(image_str, dtype=np.uint8)
data = np.reshape(data, (width, height, 3))
Получаю ошибку:
ValueError Traceback (most recent call last)
<ipython-input-1-2ffa5c8203da> in <module>
87
88 # отрисовка текста
---> 89 draw_text("Hello, World!")
90
91 pygame.display.flip()
<ipython-input-1-2ffa5c8203da> in draw_text(text)
52 image_str = pygame.image.tostring(text_surface, 'RGB', True)
53 data = np.frombuffer(image_str, dtype=np.uint8)
---> 54 data = np.reshape(data, (width, height, 3))
55
56 # наложение текстуры на квадрат
<__array_function__ internals> in reshape(*args, **kwargs)
~\anaconda3\lib\site-packages\numpy\core\fromnumeric.py in reshape(a, newshape, order)
296 [5, 6]])
297 """
--> 298 return _wrapfunc(a, 'reshape', newshape, order=order)
299
300
~\anaconda3\lib\site-packages\numpy\core\fromnumeric.py in _wrapfunc(obj, method, *args, **kwds)
55
56 try:
---> 57 return bound(*args, **kwds)
58 except TypeError:
59 # A TypeError occurs if the object does have such a method in its
ValueError: cannot reshape array of size 11016 into shape (156,24,3)
Пытался менять местами height
и width
, но не помогло. Просто уведомление ...into shape (156,24,3)
в трейсбэке ошибки преобразуется на ...into shape (24,156,3)
.
Предположил, что параметр reshape
, равный -1, позволит numpy самостоятельно подобрать недостающую размерность массива с учетом указанных размеров других осей. В итоге я поменял строку с функцией reshape()
на data = np.reshape(data, (width, -1, 3))
, но это вывело ошибку ...into shape (156,newaxis,3)
.
Что можно исправить?