Home > database >  python slicing vs matlab slicing
python slicing vs matlab slicing

Time:10-07

I'm trying to cnvert this line to python:

            xx=wqtran((nn-1)*N*2/K nN,(mm-1)*N*2/K nN,kk-1);

both (nn-1)*N*2/K nN and (mm-1)*N*2/K nN are [[1..128]] meaning array of 2D array with the shape of (1,128)

I've translated the last row to this:

        firstAxis = round(dot(dot((nn - 1), N), 2) / K   nN)
        secondAxis = round(dot(dot((mm - 1), N), 2) / K   nN)
        xx=wqtran[firstAxis-1, secondAxis-1, kk - 2]

as python counts from 0 instead of 1 and it doesn't support float indices (auto conversion).

the problem that xx is different with the 2 codes: in matlab xx is (128,128) matrix. while in python it's (1,128) matrix. Does anyone know where xx lost in translation?

Python xx

array([[-452.58030867-676.77261453j, -195.12401501-661.388484j  ,
        -174.14069268-609.99929489j, -132.25284621-580.72939701j,
        -148.73799066-547.11073351j, -159.38166597-546.81537669j,
        -161.87484594-539.42802218j, -169.35077334-545.3686585j ,
        -180.50911641-544.03823644j, -197.29690441-557.23079163j,
        -196.51746545-567.5090211j , -213.84197505-581.57152941j,
        -226.74628312-623.65644362j, -200.66624603-651.50540145j,
        -177.38731357-655.67501859j, -180.69705033-675.17325716j,
        -155.81407249-676.37138946j, -157.96308479-695.13212395j,
        -108.8650474 -736.25936469j,  -87.578376  -700.20224727j,
         -61.02036179-666.00742621j,  -64.97015   -638.36503754j,
        -101.50993294-656.93949503j,  -93.54775041-647.98566233j,
        -107.68397683-697.7795849j ,  -75.53171122-657.14821992j,
         -85.23769943-688.35238679j,  -92.83159059-686.44693563j,
         -71.43133014-697.60140338j,  -81.08785253-711.97445565j,
         -44.87630158-720.17033913j,  -52.44268065-722.02504979j,
          -5.25277497-740.89853418j,  -17.6212513 -686.37476794j,
         -29.2393824 -726.59904826j,    7.16364259-719.91709074j,
           5.90517312-717.18410487j,   22.8522649 -699.23464182j,
          18.63531638-715.0072984j ,   36.32674701-693.05814042j,
          26.7880449 -694.37681242j,   27.16655687-689.18079609j,
          27.85147304-711.44759484j,   61.06491269-720.79713687j,
          52.0941088 -706.34408308j,   75.35650028-725.46873301j,
          98.57388416-721.28197269j,  145.06602719-711.59314229j,
         141.991647  -664.74456743j,  150.71281574-653.53592807j,
         125.90978132-630.55654499j,  132.47112733-629.17946652j,
         125.51837461-616.7203905j ,  122.58396678-619.14956992j,
         142.70895126-614.49204458j,  159.16589703-593.52244992j,
         138.31128655-582.53972214j,  153.12963358-569.54241982j,
         165.29233736-545.01929937j,  154.13129768-471.78284923j,
          43.56773616-487.8220431j ,   54.25437947-524.72605456j,
          42.79114751-545.50768074j,   53.15219565-559.27877631j,
          43.76155234-560.12707983j,   54.6208528 -568.90568531j,
          56.97801932-575.17701242j,   65.2143702 -583.69413932j,
          73.23340404-580.67369009j,   79.07999037-613.44166576j,
         143.69183821-585.69001336j,  117.20653662-526.52470153j,
         100.57804234-536.03686963j,  108.44277397-538.21328614j,
          90.05264023-528.34900258j,   78.72868304-505.73274985j,
          69.97859571-513.46003129j,   66.93475688-526.93461531j,
          48.55950859-530.81706511j,   48.90034874-555.12529778j,
          96.22558483-565.6267038j ,  102.4548864 -523.24947975j,
          79.69038208-529.98772291j,   87.95211951-510.26008958j,
          89.69574996-535.75298725j,   90.254945  -499.1893208j ,
          78.94021112-511.87269866j,   81.67490639-504.04487668j,
          68.79809877-503.89951716j,   77.24724759-514.19868479j,
          58.04074534-515.98187084j,   98.08396247-507.92887948j,
         100.20824611-495.01481833j,   72.69918626-489.42866776j,
          76.7185985 -482.68643198j,   83.92155433-498.9687003j ,
          82.67280296-451.74266885j,   75.86185607-490.23454708j,
          57.94986269-458.47283805j,   41.1146784 -479.67628776j,
          78.93166632-478.31596167j,   51.50738234-477.3396975j ,
          78.20463698-494.72210057j,   85.75196528-469.34299269j,
          61.02017345-467.76114977j,  106.63119269-448.17563021j,
          84.6209639 -460.80005868j,  132.04063304-453.84619813j,
         130.40574008-287.10743659j,   -6.2580409 -359.45507084j,
          -5.28309533-400.4593048j ,    8.32020675-420.38420677j,
          12.90232396-425.91811269j,   55.04695631-409.77248592j,
          48.69647754-392.02448157j,   45.78594751-370.02692246j,
          50.11015329-338.79344838j,   -8.11827553-322.21361504j,
           3.22840585-285.08547853j,  -69.03273845-292.52545131j,
         -92.47239304-306.54784527j, -110.46527378-324.81171773j,
        -118.13552928-282.0133424j , -156.30293279-316.89599142j,
        -205.25063008-284.99760596j, -262.9615674 -320.56291071j,
        -297.34446645-364.17111847j, -388.19490322-330.83950936j]])

matlab xx too big for the post first rows:

  Columns 1 through 5

  -4.5258 - 6.7677i  -2.8199 - 6.5171i  -2.5924 - 6.3501i  -2.2652 - 6.1454i  -2.1380 - 6.0565i
  -3.3526 - 7.0387i  -1.9512 - 6.6139i  -1.8210 - 6.3541i  -1.5917 - 6.1802i  -1.5068 - 6.0629i
  -2.9576 - 6.8487i  -1.7324 - 6.2677i  -1.7414 - 6.1000i  -1.5113 - 5.9629i  -1.4118 - 5.8737i
  -2.5942 - 6.5328i  -1.6652 - 6.0255i  -1.5915 - 6.0017i  -1.3225 - 5.8073i  -1.2911 - 5.6604i
  -2.7038 - 6.1171i  -1.8519 - 5.7833i  -1.6694 - 5.7016i  -1.5398 - 5.4927i  -1.4874 - 5.4711i
  -3.0414 - 6.0944i  -2.0874 - 5.8841i  -1.9274 - 5.7351i  -1.7284 - 5.6416i  -1.6399 - 5.4976i
  -3.1291 - 6.2552i  -2.1179 - 5.9566i  -1.9873 - 5.8116i  -1.7679 - 5.6209i  -1.7752 - 5.5574i
  -3.1846 - 6.2824i  -2.2147 - 5.9888i  -2.0517 - 5.8205i  -1.9089 - 5.6169i  -1.8547 - 5.5742i
  -3.3634 - 6.3435i  -2.3585 - 6.0483i  -2.2724 - 5.8377i  -2.1611 - 5.7308i  -2.0719 - 5.6881i
  -3.4930 - 6.5714i  -2.4824 - 6.2474i  -2.4096 - 6.1046i  -2.1738 - 6.0056i  -2.0842 - 5.8660i
  -3.4977 - 6.6898i  -2.4959 - 6.3652i  -2.3771 - 6.2161i  -2.1896 - 5.9859i  -2.2244 - 5.9183i
  -3.7146 - 6.8227i  -2.6272 - 6.4702i  -2.5624 - 6.2801i  -2.4266 - 6.1418i  -2.3639 - 6.1235i
  -3.8749 - 7.2053i  -2.8709 - 6.7784i  -2.7552 - 6.6938i  -2.5841 - 6.5032i  -2.4996 - 6.4839i
  -3.7870 - 7.6706i  -2.6680 - 7.3165i  -2.4975 - 7.0619i  -2.3808 - 6.9107i  -2.2599 - 6.8245i
  -3.5470 - 7.9192i  -2.3884 - 7.3498i  -2.3778 - 7.1098i  -2.2237 - 6.9752i  -2.1495 - 6.8788i
  -3.3774 - 8.1407i  -2.3445 - 7.4918i  -2.3308 - 7.3440i  -2.1527 - 7.2085i  -2.0745 - 7.1216i
  -3.1525 - 8.2276i  -2.2111 - 7.6250i  -2.1091 - 7.5007i  -1.9231 - 7.3094i  -1.8284 - 7.2038i
  -3.0647 - 8.3645i  -2.0377 - 7.7732i  -1.9548 - 7.5233i  -1.8111 - 7.3576i  -1.7689 - 7.2205i
  -2.9077 - 8.4493i  -1.9463 - 7.7723i  -1.9293 - 7.6172i  -1.7293 - 7.4210i  -1.6972 - 7.3599i
  -2.8770 - 8.5876i  -1.8656 - 7.9865i  -1.7569 - 7.7734i  -1.6328 - 7.5554i  -1.5008 - 7.4696i
  -2.7261 - 8.8312i  -1.6047 - 8.0594i  -1.5835 - 7.8066i  -1.4221 - 7.5995i  -1.3657 - 7.4299i
  -2.5481 - 8.9706i  -1.4817 - 8.0861i  -1.4902 - 7.8014i  -1.4058 - 7.6098i  -1.3197 - 7.4890i
  -2.3348 - 9.2287i  -1.2996 - 8.1146i  -1.4435 - 7.9271i  -1.2240 - 7.7699i  -1.1770 - 7.5609i
  -1.9191 - 9.3370i  -1.1828 - 8.1255i  -1.2125 - 8.0338i  -1.0260 - 7.7334i  -1.0170 - 7.5347i
  -1.7057 - 9.2125i  -1.0760 - 8.1519i  -1.0698 - 7.9991i  -0.9242 - 7.6857i  -1.0191 - 7.4748i
  -1.5766 - 9.3942i  -0.9115 - 8.2014i  -0.9481 - 8.0558i  -0.8732 - 7.6749i  -0.9802 - 7.6137i
  -1.1969 - 9.5142i  -0.7600 - 8.2883i  -0.7354 - 8.0880i  -0.8064 - 7.7545i  -0.8295 - 7.6697i
  -0.6769 - 9.4567i  -0.4273 - 8.1623i  -0.5976 - 8.0069i  -0.6075 - 7.7987i  -0.6769 - 7.6913i
  -0.3850 - 9.0560i  -0.4248 - 8.0788i  -0.4050 - 8.0236i  -0.4633 - 7.7094i  -0.5513 - 7.7039i
  -0.4366 - 8.8908i  -0.2136 - 8.0561i  -0.2837 - 7.8554i  -0.3773 - 7.6979i  -0.3598 - 7.6238i
  -0.1777 - 8.9291i  -0.0988 - 7.8777i  -0.2033 - 7.8333i  -0.2561 - 7.5843i  -0.3953 - 7.5606i
  -0.0161 - 8.6390i  -0.1203 - 7.8495i  -0.1071 - 7.7569i  -0.2803 - 7.6176i  -0.2740 - 7.7102i
   0.1264 - 8.6460i   0.1332 - 7.8396i   0.0593 - 7.6877i  -0.0735 - 7.6183i   0.0476 - 7.6904i
   0.5057 - 8.2794i   0.2117 - 7.5596i   0.0900 - 7.5168i   0.0649 - 7.5802i   0.2925 - 7.4029i
   0.2960 - 7.7818i   0.1738 - 7.4925i   0.1958 - 7.4376i   0.2700 - 7.3344i   0.2059 - 7.0959i
   0.1925 - 7.8667i   0.3320 - 7.3270i   0.1611 - 7.1907i   0.1782 - 7.1215i   0.0658 - 7.0173i
   0.2259 - 7.5840i   0.1145 - 7.0688i   0.0032 - 7.1909i   0.0513 - 7.1091i   0.0311 - 7.0961i
   0.0885 - 7.5782i   0.0182 - 7.1834i   0.0570 - 7.2710i   0.2009 - 7.1118i   0.0902 - 6.9441i
   0.0255 - 7.4985i   0.0030 - 7.1903i   0.1157 - 7.2326i   0.0663 - 6.9297i  -0.0887 - 7.0950i
   0.1082 - 7.5894i   0.1059 - 7.2266i   0.2692 - 7.1582i   0.0889 - 7.0127i   0.2412 - 7.0495i
   0.1297 - 7.4225i   0.0920 - 7.1568i   0.1424 - 7.0073i   0.0280 - 7.0163i   0.0716 - 6.9444i

CodePudding user response:

This is advanced indexing in numpy:

In [30]: arr = np.arange(9).reshape(3,3)
In [31]: arr
Out[31]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

2 indexing arrays (same for display convenience):

In [32]: i, j = np.array([0,1,2]), np.array([0,1,2])
In [33]: arr[i,j]
Out[33]: array([0, 4, 8])

We have 2 arrays with shape (3,), and the result is also (3,), the 'diagonal' of the array. To do the same in MATLAB we have to use sub2ind or something like that to translate the index pairs into a flat index.

But if the first index is (3,1), then we get a (3,3) result, a block. (this is the default for MATLAB syntax):

In [34]: i1 = i.reshape(3,1)
In [35]: arr[i1,j]
Out[35]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
In [36]: i1,j
Out[36]: 
(array([[0],
        [1],
        [2]]),
 array([0, 1, 2]))

ix_ is convenient tool for generating the column vector i1:

In [37]: arr[np.ix_(i,j)]
Out[37]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

In numpy getting the diagonal and the block are doing the same thing, broadcasting the indexing array against each other.

The equivalent broadcasting with addition:

In [38]: 10*i j
Out[38]: array([ 0, 11, 22])
In [39]: 10*i1 j
Out[39]: 
array([[ 0,  1,  2],
       [10, 11, 12],
       [20, 21, 22]])

With your (1,128) arrays, transpose would do the trick:

In [40]: I=i.reshape(1,3); J=j.reshape(1,3)
In [41]: I
Out[41]: array([[0, 1, 2]])
In [42]: arr[I,J]
Out[42]: array([[0, 4, 8]])
In [43]: _.shape
Out[43]: (1, 3)
In [44]: arr[I.T,J]
Out[44]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

I didn't use transpose with i, because it's 1d. The fact that MATLAB matrices are always 2d (or higher) and numpy can be 0 or 1d is one of hardest things for wayward MATLAB users to grasp.

CodePudding user response:

If you do

array[rows, cols]

where rows and cols are lists/np.arrays, numpy will select the elements at

[[rows[0], cols[0]], [rows[1], cols[1]],..., [rows[n], cols[n]]]

If you're working with numpy arrays, the following should do what you want

xx=wqtran[(firstAxis-1)[:, np.newaxis], secondAxis-1, kk - 2]

A neater solution using np.ix_ has already been posted here

  • Related