0

I'm trying to divide a large array into smaller sub-arrays, but can't figure out how to do it without resorting to a very naive method of just looping over the array with two indices, as in the following code:

import numpy as np

a = np.arange(100)
idx = np.linspace(0, 100, 9).astype(np.int16)
for idx_start, idx_end in zip(idx[:-1], idx[1:]):
    print(a[idx_start:idx_end])

Output:

[ 0  1  2  3  4  5  6  7  8  9 10 11]
[12 13 14 15 16 17 18 19 20 21 22 23 24]
[25 26 27 28 29 30 31 32 33 34 35 36]
[37 38 39 40 41 42 43 44 45 46 47 48 49]
[50 51 52 53 54 55 56 57 58 59 60 61]
[62 63 64 65 66 67 68 69 70 71 72 73 74]
[75 76 77 78 79 80 81 82 83 84 85 86]
[87 88 89 90 91 92 93 94 95 96 97 98 99]

I saw this answer, but it doesn't fit my requirements due to 2 reasons:

  1. It generates overlapping arrays
  2. it is even more unintuitive than the for loop

My question is:

Is there a way to skip the loop, and do it in a more "elegant" way (e.g., by using some numpy functionality etc.)

Thanks in advance

2 Answers 2

1

If you want the result to stay as numpy arrays

np.array_split(a, 9)
 
[array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]),
 array([12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]),
 array([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33]),
 array([34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44]),
 array([45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55]),
 array([56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66]),
 array([67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77]),
 array([78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88]),
 array([89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])]

If you want lists as output

[i.tolist() for i in np.array_split(a, 9)]
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks, that was exactly what I was looking for
1

One try, not sure if this helps, though uses for loops within List Comprehension:

>>> import math
>>> new_size=10

Create list of lists using List Comprehension:

>>> new_list = [[] for i in range(math.floor(a.size/new_size))]

Copy to new list using List Comprehension

>>> [new_list[math.floor(i/new_size)].append(i) for i in a]
[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]

Result:

>>> new_list
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], [40, 41, 42, 43, 44, 45, 46, 47, 48, 49], [50, 51, 52, 53, 54, 55, 56, 57, 58, 59], [60, 61, 62, 63, 64, 65, 66, 67, 68, 69], [70, 71, 72, 73, 74, 75, 76, 77, 78, 79], [80, 81, 82, 83, 84, 85, 86, 87, 88, 89], [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]]
>>>

Comments

Your Answer

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.