Reputation: 2387
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:
for
loopMy 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
Upvotes: 0
Views: 217
Reputation: 2332
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)]
Upvotes: 1
Reputation: 1323
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]]
>>>
Upvotes: 1