4

# 1D NumPy Strides

Unsolved
###### Data Wrangling

Difficulty: 3 | Problem written by Mr. Umair

Educational Resource: https://cs231n.github.io/python-numpy-tutorial/

Input:

Given a 1D Numpy array, your function will return a 2D matrix using strides given the length of the strides and a window length. For example, if we have a window length of 5 and stride length of 3, than we take the first 5 elements of the array, then we skip 3 elements (starting from the beginning) and then take the next 5 elements again.

Output:

Your function will return a 2D list after computation of strides on the given input values.

##### Sample Input:
<class 'numpy.ndarray'>
arr: [ 1 2 3 4 5 6 7 8 9 10]
<class 'int'>
 lengthOfStride: 2
<class 'int'>
 windowLength: 4

##### Expected Output:
<class 'list'>
[[1, 2, 3, 4], [3, 4, 5, 6], [5, 6, 7, 8], [7, 8, 9, 10]]

MLPro Premium also allows you to access all our high quality MCQs which are not available on the free tier.

Not able to solve a problem? MLPro premium brings you access to solutions for all problems available on MLPro

Have an issue, the MLPro support team is available 24X7 to Premium users.

##### This is a premium feature. To access this and other such features, click on upgrade below.

max • 3 months, 2 weeks ago

0

This doesn't make any sense, no explanation is given as to why my code fails:

def strideCalculation(arr, lengthOfStride, windowLength):

result = [arr[i:i+windowLength] for i in range(0, len(arr)-lengthOfStride, lengthOfStride)]

if len(result[-1]) < len(result[0]):

result.pop()

return result

It produces exactly the desired result for the example test case when I run it locally, and it does what the problem describes, yet it fails all 5 test cases.  There really should be some sort of feedback.

abhishek_kumar • 3 months, 2 weeks ago

0

Actually, there is a piece of wrong information in the Test case

It is given arr is a list.

But when you'll check its type it is actually NumPy.ndarray.  That's why you are not able to pass any of the tests. Since result[i] should be a list. But a/c to your code it is an array.

Still, You'll be able to pass only three test cases. I am unable to solve that two issues.

arr[i:i+windowLength ---------->   list([arr[i:i+windowLength])

1

So sorry for the confusion! We have updated the variable type for this problem to specify that the first variable is a NumPy array, not a list. We have double checked all of our problems, and this issue should no longer appear for any other problem.

We appreciate the feedback, and if you ever see anything else wrong, please feel free to file a ticket via our "Feedback" feature

Thanks!

Peter

abhishek_kumar • 3 months, 1 week ago

0

So this is one of the best examples to understand how NumPy works faster than the list.

-> Numpy uses contiguous memory.

solution:

import numpy as np
def strideCalculation(arr, lengthOfStride, windowLength):
arr = np.asarray(arr, dtype=np.int32)
shape_row = (len(arr)-(windowLength - lengthOfStride))//lengthOfStride
result  = np.lib.stride_tricks.as_strided(arr, shape=(shape_row,windowLength), strides=(lengthOfStride*4,4))
result = result.tolist()
return result

All test cases are passing but I am hoping for a better solution than this one as it seems to me in the hard category.

For a detailed explanation about Numpy strides, I followed this great article.

Advanced NumPy: Master stride tricks with 25 illustrated exercises

mvr • 1 month, 2 weeks ago

0

Might also think about mentioning library versions. For example, numpy introduced striding_window_view as an alternative to the unsafe as_strided in 1.20, which provides a very neat solution to this problem.

def strideCalculation(arr, lengthOfStride, windowLength):
return np.lib.stride_tricks.sliding_window_view(arr, windowLength)[::lengthOfStride, :].tolist()