Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to split a numpy array in fixed size chunks with and without overlap?

Lets say I have an array:

>>> arr = np.array(range(9)).reshape(3, 3)
>>> arr
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

I would like to create a function f(arr, shape=(2, 2)) that takes the array and a shape, and splits the array into chunks of the given shape without padding. Thus, by overlapping certain parts if necessary. For example:

>>> f(arr, shape=(2, 2))
array([[[[0, 1],
         [3, 4]],

        [[1, 2],
         [4, 5]]],

       [[[3, 4],
         [6, 7]],

        [[4, 5],
         [7, 8]]]])

I managed to creates to output above with np.lib.stride_tricks.as_strided(arr, shape=(2, 2, 2, 2), strides=(24, 8, 24, 8)). But I don't know how to generalize this for to all arrays and all chunk sizes.

Preferably, for 3D arrays.

If no overlap is necessary, it should avoid that. Another example:

>>> arr = np.array(range(16).reshape(4,4)
>>> arr
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
>>> f(arr, shape=(2,2))
array([[[[0, 1],
         [4, 5]],

        [[2, 3],
         [6, 7]]],

       [[[8, 9],
         [12, 13]],

        [[10, 11],
         [14, 15]]]])

skimage.util.view_as_blocks comes close, but requires that the array and block shape are compatible.

like image 765
Kay Lamerigts Avatar asked Mar 16 '17 10:03

Kay Lamerigts


People also ask

What is a correct method to split arrays NumPy?

Splitting NumPy Arrays Splitting is reverse operation of Joining. Joining merges multiple arrays into one and Splitting breaks one array into multiple. We use array_split() for splitting arrays, we pass it the array we want to split and the number of splits.

How do you split the element of a given NumPy array with spaces?

To split the elements of a given array with spaces we will use numpy. char. split(). It is a function for doing string operations in NumPy.

How do you split an array into two parts in Python?

To split a list into n parts in Python, use the numpy. array_split() function. The np. split() function splits the array into multiple sub-arrays.

How do I split a 2D NumPy array?

An array needs to explicitly import the array module for declaration. A 2D array is simply an array of arrays. The numpy. array_split() method in Python is used to split a 2D array into multiple sub-arrays of equal size.

How to split an array in NumPy?

Step 1 : Create a 2D Numpy array. There are two ways to split the array one is row-wise and the other is column-wise. By default, the array is split in row-wise (axis =0 ).

How to split an array to get the maximum possible shape?

This can be done so that the resulting arrays have shapes slightly less than the desired maximum or so that they have exactly the desired maximum except for some remainder at the end. The basic logic is to compute the parameters for splitting the array and then use array_split to split the array along each axis (or dimension) of the array.

How do I copy an array into a chunk size?

Pad the array to allow reshaping it into your chunk dimensions. Simply pad with zeros, such that each (axis_size % chunk_size) == 0. The chunk_size could be different for each axis. Padding a multidimensional array like this creates a (slightly bigger) copy.

How to split an array into multiple parts in Java?

You can split the array as many parts you want using the split () method. Let’s say I want to split the array into 3 and 4 Parts. then I will pass the 3 and 4 value as the argument inside the split () method.


Video Answer


1 Answers

There's a builtin in scikit-image as view_as_windows for doing exactly that -

from skimage.util.shape import view_as_windows

view_as_windows(arr, (2,2))

Sample run -

In [40]: arr
Out[40]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

In [41]: view_as_windows(arr, (2,2))
Out[41]: 
array([[[[0, 1],
         [3, 4]],

        [[1, 2],
         [4, 5]]],


       [[[3, 4],
         [6, 7]],

        [[4, 5],
         [7, 8]]]])

For the second part, use its cousin from the same family/module view_as_blocks -

from skimage.util.shape import view_as_blocks

view_as_blocks(arr, (2,2))
like image 72
Divakar Avatar answered Oct 11 '22 18:10

Divakar