Liam
Liam

Reputation: 51

Converting an array of floats into RGBA values in an efficient way

I am trying to create a system to take an array of floats which range from 0.0 to 1.0 and convert them into RGBA values based on a lookup table. The output should be an array that is one dimension larger that the input with the last dimension being size 4 and consisting of the RGBA values.

Currently I have only been able to do this via loops. Dose anyone know of any numpy indexing methods that could achieve this same result more efficiently.

import numpy as np
import matplotlib.pyplot as plt

cyan = np.array([(x*0,x*1,x*1,255) for x in range(256)])

input_array = np.arange(0,0.8,0.05).reshape(4,4)

input_array = input_array*256

colour_array = []
for x in range(input_array.shape[0]):
    for y in range(input_array.shape[1]):
        colour_array.append(cyan[int(input_array[x,y])])
        
colour_array = np.array(colour_array).reshape(4,4,4)

plt.imshow(colour_array) 

enter image description here

Upvotes: 1

Views: 67

Answers (2)

Onyambu
Onyambu

Reputation: 79318

Use the following:

shape = input_array.shape
index = input_array[*np.indices(shape).reshape(2, -1)].astype(int)
colour_array1 = cyan[index].reshape(4, *shape)

Confirm the two are equal:

np.allclose(colour_array, colour_array1,atol=0)
Out[62]: True

USE THE OTHER SOLUTION!!!

Upvotes: 3

Hrishabh Kumar Singh
Hrishabh Kumar Singh

Reputation: 21

import numpy as np
import matplotlib.pyplot as plt
cyan = np.array([(x*0, x*1, x*1, 255) for x in range(256)])
input_array = np.arange(0, 0.8, 0.05).reshape(4, 4)
input_array = (input_array * 256).astype(int)
colour_array = cyan[input_array]
plt.imshow(colour_array)
plt.show()

Upvotes: 2

Related Questions