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.
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.
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.
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.
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.
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 ).
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.
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.
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.
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))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With