Я хочу создать одноцветное трехканальное изображение с размерами 10x5 и фиксированным цветом [0, 1, 2]
. В настоящее время я делаю это, используя следующий код:
x = np.array([0, 1, 2])
x = np.array((x,) * 10)
x = np.array((x,) * 5)
Это работает, но не очень элегантно. Каков наилучший / наиболее эффективный способ добиться того же с меньшим количеством кода?
3 ответа
Используйте np.broadcast_to
, чтобы получить представление во входной 1D
массив -
np.broadcast_to([0, 1, 2],(5,10,3))
Если вам нужна копия с собственными данными, просто добавьте .copy()
-
np.broadcast_to([0, 1, 2],(5,10,3)).copy()
Или используйте np.tile
-
np.tile([0,1,2],(5,10,1))
Преимущество view
заключается в том, что нет дополнительной нагрузки на память и она практически свободна. -
In [17]: x0 = np.arange(3)
In [18]: %timeit np.broadcast_to(x0,(5,10,len(x0)))
100000 loops, best of 3: 3.16 µs per loop
In [19]: x0 = np.arange(3000)
In [20]: %timeit np.broadcast_to(x0,(5,10,len(x0)))
100000 loops, best of 3: 3.08 µs per loop
Как насчет обозначения среза?
a = np.empty((10,5,3))
a[:,:,0]=0
a[:,:,1]=1
a[:,:,2]=2
В качестве альтернативы вы можете использовать np.full
:
np.full((10, 5, 3), [0, 1, 2])
Он создает массив заданной формы (10, 5, 3)
и заполняет его постоянным значением [0, 1, 2]
.
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.