python切片与matlab切片

Posted

技术标签:

【中文标题】python切片与matlab切片【英文标题】:python slicing vs matlab slicing 【发布时间】:2021-11-26 19:09:28 【问题描述】:

我正在尝试将此行转换为 python:

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

(nn-1)*N*2/K+nN(mm-1)*N*2/K+nN 都是 [[1..128]] 表示形状为 (1,128) 的二维数组的数组

我已将最后一行翻译为:

        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]

因为 python 从 0 而不是 1 开始计数,并且它不支持浮点索引(自动转换)。

xx与2个代码不同的问题:在matlab中xx是(128,128)矩阵。 而在 python 中它是 (1,128) 矩阵。 有谁知道xx在翻译中丢失了哪里?

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]])

ma​​tlab xx 对于帖子的第一行来说太大了:

  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

【问题讨论】:

kk 是一个标量?使用此索引,MATLAB 返回一个块。 numpy 将 2 个索引数组一起“广播”。使用 2 个具有相同形状的数组,这意味着它将值配对 - 考虑对角线而不是块。您需要使用 (128,1) 和 (1,128) 形状的数组进行索引以获取块。迟早你需要阅读一些numpy 索引文档(不仅仅是用一些简单的经验法则来指导它)。 在本次迭代中 kk=2 【参考方案1】:

这是advanced indexing 中的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个索引数组(显示方便相同):

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])

我们有 2 个形状为 (3,) 的数组,结果也是 (3,),数组的“对角线”。为了在 MATLAB 中做同样的事情,我们必须使用 sub2ind 或类似的东西来将索引对转换为平面索引。

但是如果第一个索引是(3,1),那么我们得到一个(3,3)的结果,一个块。 (这是 MATLAB 语法的默认值):

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_是生成列向量i1的便捷工具:

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

numpy 中获取对角线和块在做同样的事情,broadcasting 索引数组相互对抗。

等价的broadcasting 加法:

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]])

使用您的 (1,128) 个数组,转置可以解决问题:

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 使用转置,因为它是 1d。 MATLAB 矩阵总是 2d(或更高)且numpy 可以是 0 或 1d 的事实是任性的 MATLAB 用户最难掌握的事情之一。

【讨论】:

我不太确定我是否理解你能告诉我我的变量吗? xx=wqtran[firstAxis-1, secondAxis-1, kk - 2] 我的最后一个例子没有帮助吗?将 (1,128) 转换为 (128,1) 的那个?【参考方案2】:

如果你这样做

array[rows, cols]

其中rowscols 是列表/np.arrays,numpy 将选择位于的元素

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

如果您正在使用 numpy 数组,则以下内容应该可以满足您的需求

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

使用np.ix_ 的更简洁的解决方案已经发布here

【讨论】:

我正在使用 libsmop,当我使用它时,我得到了这个(通过 np.array 进行 conersion 之后): TypeError: int() argument must be a string, a bytes-like object or a number,不是'NoneType' smop 就像 small matlab and octave to python compiler?您并没有真正提供有关该错误的任何上下文,但它似乎无关,所以我认为您的代码还有其他问题。抱歉格式化(相当缺乏),这是一个在python repl中显示它的最小示例:>>> a = np.arange(3*3*2).reshape(3, 3, 2) >>> rows = np.array([0, 1]) >>> cols = np.array([1, 2]) >>> a[rows[:, np.newaxis], cols, 0] array([[ 2 , 4], [ 8, 10]])

以上是关于python切片与matlab切片的主要内容,如果未能解决你的问题,请参考以下文章

Python进阶:迭代器与迭代器切片

python--pandas切片

python——入门系列索引与切片

对比 Python 原生切片,讲述 Numpy 数组切片!

Python切片中的误区与高级用法

python之切片与迭代