user7811364
user7811364

Reputation:

Trouble determining slice indices for NumPy array

I have a NumPy array of X * Y elements, represented as a flatted array (arr = np.array(x * y)).

Given the following values:

X = 832
Y = 961

I need to access elements of the array in the following sequence:

arr[0:832:2]
arr[1:832:2]
arr[832:1664:2]
arr[833:1664:2]
...
arr[((Y-1) * X):(X * Y):2]

I'm not sure, mathematically, how to achieve the start and stop for each iteration in a loop.

Upvotes: 1

Views: 92

Answers (3)

Inder
Inder

Reputation: 3816

This should do the trick

Y = 961
X = 832

all_ = np.random.rand(832*961)

# Iterating over the values of y
for i in range(1,Y):
    # getting the indicies from the array we need
    # i - 1 = Start
    # X*i = END
    # 2 is the step
    indicies = list(range(i-1,X*i,2))
    # np.take slice values from the array or get values corresponding to the list of indicies we prepared above
    required_array = np.take(indices=indices)
    

Upvotes: 1

Mad Physicist
Mad Physicist

Reputation: 114350

Let's say you have an array of shape (x * y,) that you want to process in chunks of x. You can simply reshape your array to shape (y, x) and process the rows:

>>> x = 832
>>> y = 961
>>> arr = np.arange(x * y)

Now reshape, and process in bulk. In the following example, I take the mean of each row. You can apply whatever functions you want to the entire array this way:

>>> arr = arr.reshape(y, x)
>>> np.mean(arr[:, ::2], axis=1)
>>> np.mean(arr[:, 1::2], axis=1)

The reshape operation does not alter the data in your array. The buffer it points to is the same as the original. You can invert the reshape by calling ravel on the array.

Upvotes: 0

user7811364
user7811364

Reputation:

To anybody interested in this solution (per iteration, not incrementing the shift each iteration):

for i in range(Y):
    shift = X * (i // 2)
    begin = (i % 2) + shift
    end = X + shift
    print(f'{begin}:{end}:2')

Upvotes: 0

Related Questions