Home > Mobile >  Accessing columns of matlab matrix and its realization in numpy
Accessing columns of matlab matrix and its realization in numpy

Time:09-17

I am trying to find a realization of accessing elements of numpy arrays corresponding to a feature of Matlab.

Suppose given a (2,2,2) Matlab matrix m in the form

m(:,:,1) = [1,2;3,4]
m(:,:,2) = [5,6;7,8]

Even though this is a 3-d array, Matlab allows accessing its column in the fashion like

m(:,1) = [1;3]
m(:,2) = [2;4]
m(:,3) = [5;7]
m(:,4) = [6;8]

I am curious to know that if numpy supports such indexing so that given the following array

m = array([[[1, 2],
            [3, 4]],

           [[5, 6],
            [7, 8]]])

One can also access columns in the fashion as Matlab listed above.

CodePudding user response:

My answer to this question is as following, suppose given the array listed as in the question

m = array([[[1, 2],
            [3, 4]],

           [[5, 6],
            [7, 8]]])

One can create a list, I call it m_list in the form such that

m_list = [m[i][:,j] for i in range(m.shape[0]) for j in range(m.shape[-1])]

This will output m_list in the form such that

m_list = [array([1, 3]), array([2, 4]), array([7, 9]), array([ 8, 10])]

Now we can access elements of m_list exactly as the fashion as Matlab as listed in the question.

CodePudding user response:

In [41]: m = np.arange(1,9).reshape(2,2,2)
In [42]: m
Out[42]: 
array([[[1, 2],
        [3, 4]],

       [[5, 6],
        [7, 8]]])

Indexing the equivalent blocks:

In [47]: m[0,:,0]
Out[47]: array([1, 3])
In [48]: m[0,:,1]
Out[48]: array([2, 4])
In [49]: m[1,:,0]
Out[49]: array([5, 7])
In [50]: m[1,:,1]
Out[50]: array([6, 8])

We can reshape, to "flatten" one pair of dimensions:

In [84]: m = np.arange(1,9).reshape(2,2,2)
In [85]: m.reshape(2,4)
Out[85]: 
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])
In [87]: m.reshape(2,4)[:,2]
Out[87]: array([3, 7])

and throw in a transpose:

In [90]: m.transpose(1,0,2).reshape(2,4)
Out[90]: 
array([[1, 2, 5, 6],
       [3, 4, 7, 8]])

MATLAB originally was strictly 2d. Then sometime around v3.9 (2000) they allowed for more, but in a kludgy way. They added a way to index the trailing dimension as though it was multidimensional. In another recent SO I noticed that when reshaping to (2,2,1,1) the result remained (2,2). Trailing size 1 dimensions are squeeze out.

I suspect the m(:,3) is a consequence of that as well.

Testing a 4d MATLAB

>> m=reshape(1:36,2,3,3,2);
>> m(:,:,1)
ans =

   1   3   5
   2   4   6

>> reshape(m,2,3,6)(:,:,1)
ans =

   1   3   5
   2   4   6

>> m(:,17)
ans =

   33
   34

>> reshape(m,2,18)(:,17)
ans =

   33
   34
  • Related