1

For example, I have nparray:

a = np.arange(48).reshape((3,4,4))
'''
[[[ 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]]]
'''

I have two arrays that used as the starting point of slicing on axis=1, axis=2 respectively:

b1 = [0,1,2]
b2 = [1,0,0]

I want to achieve, a slicing like:

a[:,b1:b1+2, b2:b2+2] # but this syntax is wrong

To get

[
[
[1,2]
[5,6]
]

[
[20 21]
[24 25]
]

[
[40 41]
[44 45]
]
]

Please let me know if you know the proper syntax for doing this?

Jason
  • 3,166
  • 3
  • 20
  • 37

1 Answers1

1

you can use the built-in functions enumerate with zip:

list(a[i][f:f+2, s:s+2].tolist() for i, (f, s) in enumerate(zip(b1, b2)))

output:

[[[1, 2], [5, 6]], [[20, 21], [24, 25]], [[40, 41], [44, 45]]]
kederrac
  • 16,819
  • 6
  • 32
  • 55
  • Thanks for mentioning zip, I almost got it by breaking it down to two steps without using zip, but with zip, it could be done within the list comprehension. My final solution is: `d = np.array([a[i,c1:c1+2, c2:c2+2] for i, (c1,c2) in enumerate(zip(b1,b2))])` – Jason Mar 16 '20 at 01:07