Downsampling a 2d numpy array in python

I'm self learning python and have found a problem which requires down sampling a feature vector. I need some help understanding how down-sampling a array. in the array each row represents an image by being number from 0 to 255. I was wonder how you apply down-sampling to the array? I don't want to scikit-learn because I want to understand how to apply down-sampling. If you could explain down-sampling too that would be amazing thanks.

the feature vector is 400x250

3 Answers

If with downsampling you mean something like this, you can simply slice the array. For a 1D example:

import numpy as np a = np.arange(1,11,1) print(a) print(a[::3]) 

The last line is equivalent to:

print(a[0:a.size:3]) 

with the slicing notation as start:stop:step

Result:

[ 1 2 3 4 5 6 7 8 9 10]

[ 1 4 7 10]

For a 2D array the idea is the same:

b = np.arange(0,100) c = b.reshape([10,10]) print(c[::3,::3]) 

This gives you, in both dimensions, every third item from the original array.

Or, if you only want to down sample a single dimension:

d = np.zeros((400,250)) print(d.shape) e = d[::10,:] print(e.shape) 

(400, 250)

(40, 250)

The are lots of other examples in the Numpy manual

5

If you want to downsample along certain dimensions, you can use mean, which not only decimates, but also downsamples. Below example: Downsamples an ndarray of size (h,w,3) along axes 0,1, but not along dim 3:

def downsample_2x(arrayn3d): """ Downsamples an ndarray of size `(h,w,3)` along axes 0,1 (along w,h) Input can be non-float, e.g. uint8 """ dtype1 = array3d.dtype a = array3d.astype(float) (h,w,_) = a.shape assert w % 2 == 0 assert h % 2 == 0 w2 = int(w/2) h2 = int(h/2) a = a.reshape((h,w2,2,3)) a = np.mean(a, axis=2) assert a.shape == (h,w2,3) a = a.reshape((h2,2,w2,3)) a = np.mean(a, axis=1) assert a.shape == (h2,w2,3) a = np.floor(a).astype(dtype1) return a 

Which gives a matrix of size (w/2,h/2,3). If w and h are not even numbers, it will be slightly more complicated. This is not the most efficient way to do it, but the steps and ideas should be clear.

from skimage.measure import block_reduce
new_matrix=block_reduce(Matrix_for_downsample,block_size=(m,n),func=)

2

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like