Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Numpy array slice using tuple

I've read the numpy doc on slicing(especially the bottom where it discusses variable array indexing) https://docs.scipy.org/doc/numpy/user/basics.indexing.html

But I'm still not sure how I could do the following: Write a method that either returns a 3D set of indices, or a 4D set of indices that are then used to access an array. I want to write a method for a base class, but the classes that derive from it access either 3D or 4D depending on which derived class is instantiated.

Example Code to illustrate idea: import numpy as np

a = np.ones([2,2,2,2])
size = np.shape(a)
print(size)
for i in range(size[0]):
  for j in range(size[1]):
    for k in range(size[2]):
      for p in range(size[3]):
        a[i,j,k,p] = i*size[1]*size[2]*size[3] + j*size[2]*size[3] + k*size[3] + p

print(a)

print('compare')
indices = (0,:,0,0)
print(a[0,:,0,0])
print(a[indices])

In short, I'm trying to get a tuple(or something) that can be used to make both of the following access depending on how I fill the tuple:

a[i, 0, :, 1]

a[i, :, 1]

The slice method looked promising, but it seems to require a range, and I just want a ":" i.e. the whole dimension. What options are out there for variable numpy array dimension access?

like image 998
wandadars Avatar asked Feb 07 '26 02:02

wandadars


1 Answers

In [324]: a = np.arange(8).reshape(2,2,2)
In [325]: a
Out[325]: 
array([[[0, 1],
        [2, 3]],

       [[4, 5],
        [6, 7]]])

slicing:

In [326]: a[0,:,0]
Out[326]: array([0, 2])
In [327]: idx = (0,slice(None),0)   # interpreter converts : into slice object
In [328]: a[idx]
Out[328]: array([0, 2])

In [331]: idx
Out[331]: (0, slice(None, None, None), 0)
In [332]: np.s_[0,:,0]              # indexing trick to generate same
Out[332]: (0, slice(None, None, None), 0)
like image 156
hpaulj Avatar answered Feb 08 '26 19:02

hpaulj



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!