Я хочу создать одноцветное трехканальное изображение с размерами 10x5 и фиксированным цветом [0, 1, 2]. В настоящее время я делаю это, используя следующий код:

x = np.array([0, 1, 2])
x = np.array((x,) * 10)
x = np.array((x,) * 5)

Это работает, но не очень элегантно. Каков наилучший / наиболее эффективный способ добиться того же с меньшим количеством кода?

1
Jan Rüegg 20 Авг 2018 в 17:18

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
1
Divakar 20 Авг 2018 в 14:37

Как насчет обозначения среза?

a = np.empty((10,5,3))
a[:,:,0]=0
a[:,:,1]=1
a[:,:,2]=2
1
Dschoni 20 Авг 2018 в 14:21

В качестве альтернативы вы можете использовать np.full:

np.full((10, 5, 3), [0, 1, 2])

Он создает массив заданной формы (10, 5, 3) и заполняет его постоянным значением [0, 1, 2].

2
taras 20 Авг 2018 в 14:51
51932766