## Transform numpy array with image data to long format

I want to transform an image to "long format" and back. My code right now is

import numpy as np import pandas as pd img = mpimg.imread('/path/image.png') image = [] for i in range(img.shape[0]): for j in range(img.shape[1]): image.append([i, j] + img[i, j].tolist()) image = np.array(image)

but I am sure there is a more efficient, but strangely could not find anything on the Internet. What is a faster solution?

The code above produces the correct result. My image is colored, so `img.shape`

is a 3-tuple.

Here's one way -

m,n = img.shape[:2] r,c = np.mgrid[:m,:n] out = np.column_stack((r.ravel(), c.ravel(), img.reshape(-1,img.shape[2])))

Alternative to get `r,c`

:

r,c = np.indices(img.shape[:2])

Another with array-assignment -

m,n,r = img.shape out = np.empty((m,n,2+r), dtype=img.dtype) out[:,:,0] = np.arange(m)[:,None] out[:,:,1] = np.arange(n) out[:,:,2:] = img out = out.reshape(m*n,-1)

**Importing Image Data into NumPy Arrays,** In machine learning, Python uses image data in the form of a NumPy array, i.e., Converting the loaded images to the NumPy array and back. Use slice notation to fill right half of the array with blue. Here is the complete code: importnumpyasnpfromPILimportImagearray=np.zeros([100,200,3],dtype=np.uint8)array[:,:100]=[255,128,0]#Orange left sidearray[:,100:]=[0,0,255]#Blue right sideimg=Image.fromarray(array)img.save('testrgb.png') And here is the image:

Here's a way using `np.indices`

, transposing to match your loop and reshaping to get a 2D array.

ix = np.transpose(np.indices(img.shape[:2]), (1,2,0)) image = np.concatenate((ix, img), axis=2).reshape(-1, image.shape[2] + 2)

**Reshape numpy arrays—a visualization,** Reshape numpy arrays in Python — a step-by-step pictorial tutorial how pd. melt reshapes pandas dataframes from wide to long form� I'm trying to convert an image from a numpy array format to a PIL one. This is my code: img = numpy.array(image) row,col,ch= np.array(img).shape mean = 0 # var = 0.1 # sigma = var**0.5 gauss = np.random.normal(mean,1,(row,col,ch)) gauss = gauss.reshape(row,col,ch) noisy = img + gauss im = Image.fromarray(noisy)

Just to get the timing:

import matplotlib.image as mpimg import numpy as np import pandas as pd import time t0 = time.time() image_orig = [] for i in range(img.shape[0]): for j in range(img.shape[1]): image_orig.append([i, j] + img[i, j].tolist()) image_orig = np.array(image_orig) print(time.time() - t0) t0 = time.time() ix = np.transpose(np.indices(img.shape[:2]), (1,2,0)) image = np.concatenate((ix, img), axis=2).reshape(-1, img.shape[2] + 2) print(time.time() - t0) t0 = time.time() m,n = img.shape[:2] r,c = np.indices(img.shape[:2]) out = np.column_stack((r.ravel(), c.ravel(), img.reshape(-1,img.shape[2]))) print(time.time() - t0) t0 = time.time() m,n,r = img.shape out = np.empty((m,n,2+r), dtype=img.dtype) out[:,:,0] = np.arange(m)[:,None] out[:,:,1] = np.arange(n) out[:,:,2:] = img out = out.reshape(m*n,-1) print(time.time() - t0)

0.17211008071899414

0.001434326171875

0.0013523101806640625

0.0008423328399658203

The last variant seems to be the fastest.

**numpy.reshape — NumPy v1.19 Manual,** Gives a new shape to an array without changing its data. Parameters It is not always possible to change the shape of an array without copying the data. If you want an error to For example, let's say you have an array: >>> By storing the images read by Pillow(PIL) as a NumPy array ndarray, various image processing can be performed using NumPy functions. By the operation of ndarray, acquisition and rewriting of pixel values, trimming by slice, concatenating can be done. Those who are used to NumPy can do a lot of things without using libraries such as OpenCV.

**1. Basic Image Handling and Processing,** To read an image and convert it to grayscale, just add convert('L') like this: Using the save() method, PIL can save images in most image file formats. Here's an example NumPy arrays will be our main tool for working with images and data. From image files to Numpy Arrays!¶ Since we can't work directly with the data here in Kaggle (because it has more than 1k files), this notebook assumes it is in a "/src" folder and you're working with the data decompressed in a "/data/all" folder.

**From image files to numpy arrays!,** Explore and run machine learning code with Kaggle Notebooks | Using data from print("Working with {0} images".format(len(onlyfiles))) print("Image examples: a PIL image img.thumbnail((image_width, image_height)) # Convert to Numpy� You don't need to iterate over the x and y positions of the image array. Use the numpy array to check if the array is above of below the threshold of interest. Here is some code that produces a boolean (true/false) array as the black and white image.

The function supports all the generic types and built-in types of data. Problem #1 : Given a numpy array whose underlying data is of 'int32' type. Change the dtype of the given object to 'float64'. Solution : We will use numpy.astype() function to change the data type of the underlying data of the given numpy array.

##### Comments

- Is this a working code (one that gives expected output)? Also, is
`img`

a 2D (grayscale) or 3D (RGB) array? - @Divakar: I clarified this in the question.
- What do you mean by
`long format`

? Your image as an array will be (n,m,3) shape. What the result supposed to be? - @hpaulj: The result is supposed to look like the result that my code produces. My code should be a minimal working implementation. Does it it not work for you?