python一维数据求极小值(含噪声)

python一维数据处理,编写一段代码,能够找出数据中对称的点的索引值,并计算长度。简单说就是计算图片中第1对的在数组中索引值的差,第2对在数组中索引值的差,靠近中心的应该是比较对称,边缘可能不太对称,可以只计算9组或者往上。

img


train_data =  [95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 87975.0, 84150.0, 81600.0, 86955.0, 88740.0, 89760.0, 90270.0, 90270.0, 88230.0, 83130.0, 84405.0, 86955.0, 87975.0, 88485.0, 86955.0, 82110.0, 78540.0, 83130.0, 85425.0, 85935.0, 85170.0, 80325.0, 76755.0, 78030.0, 82875.0, 84150.0, 84150.0, 81600.0, 75735.0, 75480.0, 80325.0, 80070.0, 81600.0, 81600.0, 80070.0, 75225.0, 72165.0, 75735.0, 78540.0, 81345.0, 80070.0, 81090.0, 75480.0, 72675.0, 71655.0, 75480.0, 78030.0, 77775.0, 79560.0, 79560.0, 77265.0, 73950.0, 71910.0, 73440.0, 75225.0, 76500.0, 77010.0, 78285.0, 79050.0, 78795.0, 75225.0, 71655.0, 68850.0, 71145.0, 74715.0, 74460.0, 76245.0, 77010.0, 77010.0, 77265.0, 77775.0, 78285.0, 77775.0, 77775.0, 78285.0, 78795.0, 79560.0, 78795.0, 78795.0, 79560.0, 80835.0, 80325.0, 80325.0, 80325.0, 81600.0, 80070.0, 81345.0, 81855.0, 80835.0, 81600.0, 80325.0, 82110.0, 81855.0, 81345.0, 81855.0, 81855.0, 81345.0, 82110.0, 82875.0, 81855.0, 81855.0, 83385.0, 82620.0, 82365.0, 82365.0, 81855.0, 82875.0, 82875.0, 83640.0, 83385.0, 83130.0, 82620.0, 82875.0, 82620.0, 82365.0, 83130.0, 83640.0, 82620.0, 82620.0, 83640.0, 83130.0, 82875.0, 82365.0, 83895.0, 82365.0, 83130.0, 82620.0, 82620.0, 82110.0, 81855.0, 81855.0, 82620.0, 82875.0, 83385.0, 83640.0, 83640.0, 82875.0, 82620.0, 85935.0, 87465.0, 86190.0, 81855.0, 67065.0, 51765.0, 62730.0, 83640.0, 85680.0, 84405.0, 83640.0, 83130.0, 83130.0, 82620.0, 82365.0, 82110.0, 81855.0, 82875.0, 83640.0, 82875.0, 83385.0, 83895.0, 83640.0, 82875.0, 83130.0, 82620.0, 83385.0, 83385.0, 82365.0, 82365.0, 82110.0, 83130.0, 82620.0, 80580.0, 80835.0, 82365.0, 82365.0, 81345.0, 81855.0, 81855.0, 81600.0, 82365.0, 80580.0, 81600.0, 81345.0, 80070.0, 81090.0, 81090.0, 82110.0, 81345.0, 80580.0, 79815.0, 81090.0, 80580.0, 81345.0, 79305.0, 80580.0, 79815.0, 81090.0, 80070.0, 79560.0, 80070.0, 79560.0, 80070.0, 80325.0, 79560.0, 79560.0, 79560.0, 78795.0, 78285.0, 78540.0, 77520.0, 78030.0, 77775.0, 76245.0, 77265.0, 76755.0, 75225.0, 75735.0, 74970.0, 72420.0, 70890.0, 68595.0, 70635.0, 73695.0, 76500.0, 78030.0, 77010.0, 76755.0, 75225.0, 71910.0, 69360.0, 70380.0, 73695.0, 78795.0, 78285.0, 75225.0, 76245.0, 73185.0, 71400.0, 73440.0, 76755.0, 80580.0, 79560.0, 78030.0, 77265.0, 73695.0, 72930.0, 75990.0, 80070.0, 79815.0, 80325.0, 78540.0, 73185.0, 76245.0, 81090.0, 82620.0, 82365.0, 80835.0, 77775.0, 77775.0, 81090.0, 84150.0, 84150.0, 83640.0, 78795.0, 79815.0, 84405.0, 86445.0, 86445.0, 83640.0, 79560.0, 82620.0, 88485.0, 88740.0, 87210.0, 83130.0, 82875.0, 87210.0, 89250.0, 87720.0, 86190.0, 81345.0, 84405.0, 88230.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0]
test_data = [91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91035.0, 80835.0, 77265.0, 84150.0, 85170.0, 85935.0, 81090.0, 75990.0, 81600.0, 82875.0, 83895.0, 74715.0, 71655.0, 76755.0, 79305.0, 80325.0, 72675.0, 68850.0, 74460.0, 75990.0, 77265.0, 70125.0, 67320.0, 71655.0, 74205.0, 75990.0, 69870.0, 65535.0, 69360.0, 72165.0, 72930.0, 71145.0, 65025.0, 62730.0, 68595.0, 70890.0, 72420.0, 67065.0, 64005.0, 61710.0, 66300.0, 70125.0, 71145.0, 69870.0, 64005.0, 61965.0, 65535.0, 67830.0, 68850.0, 69360.0, 67320.0, 63240.0, 59670.0, 63495.0, 65790.0, 67320.0, 69105.0, 69105.0, 65535.0, 62985.0, 60435.0, 63240.0, 65025.0, 65535.0, 67575.0, 68085.0, 69105.0, 68595.0, 64260.0, 62730.0, 61200.0, 63750.0, 65535.0, 66555.0, 67575.0, 68595.0, 69105.0, 69870.0, 69360.0, 70380.0, 71400.0, 70890.0, 70890.0, 70125.0, 71145.0, 70890.0, 69870.0, 71655.0, 72930.0, 72675.0, 72165.0, 72165.0, 72420.0, 72675.0, 72420.0, 73695.0, 73440.0, 74205.0, 74715.0, 71910.0, 73440.0, 73950.0, 73950.0, 73185.0, 73695.0, 73440.0, 74715.0, 74460.0, 72930.0, 69105.0, 69105.0, 67320.0, 67320.0, 66555.0, 64770.0, 68085.0, 67830.0, 70890.0, 71145.0, 70890.0, 70635.0, 70890.0, 72165.0, 71400.0, 72420.0, 72675.0, 71655.0, 71655.0, 70125.0, 72165.0, 71400.0, 71655.0, 72165.0, 71910.0, 72420.0, 71145.0, 70380.0, 70890.0, 71910.0, 69870.0, 68085.0, 69105.0, 65790.0, 69105.0, 69105.0, 68595.0, 68595.0, 67830.0, 67575.0, 66045.0, 65025.0, 65790.0, 64515.0, 62475.0, 59925.0, 58140.0, 62220.0, 66555.0, 67575.0, 67065.0, 66045.0, 65790.0, 65025.0, 61200.0, 59670.0, 60945.0, 63750.0, 67320.0, 67320.0, 66555.0, 65535.0, 63240.0, 60180.0, 61965.0, 64260.0, 68340.0, 68085.0, 66810.0, 63240.0, 60945.0, 62985.0, 68595.0, 69615.0, 68085.0, 66045.0, 62475.0, 63240.0, 68340.0, 71655.0, 71655.0, 67320.0, 64770.0, 65535.0, 71145.0, 75480.0, 72420.0, 69870.0, 66300.0, 70125.0, 76245.0, 75480.0, 71910.0, 67830.0, 71400.0, 79305.0, 76755.0, 73185.0, 69105.0, 75480.0, 79560.0, 76500.0, 73695.0, 70890.0, 78795.0, 79815.0, 78030.0, 73185.0, 75990.0, 82365.0, 81855.0, 78030.0, 78540.0, 84660.0, 84660.0, 82110.0, 81090.0, 85170.0, 83640.0, 80835.0, 77265.0, 80835.0, 87210.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0, 91800.0]

如果想要找出数据中对称的点的索引值,可以使用以下代码:

symmetry_indices = []
for i in range(len(train_data)):
  if train_data[i] == train_data[-i-1]:  # 判断是否对称
    symmetry_indices.append(i)

上面的代码会找出所有的对称点的索引值,存储在列表symmetry_indices中。

如果只想计算长度,可以使用以下代码:


lengths = []
for i in range(len(symmetry_indices)//2):
  lengths.append(symmetry_indices[2*i+1] - symmetry_indices[2*i])

上面的代码会计算所有的对称点对的长度,存储在列表lengths中。

如果只想计算前9对的长度,可以修改代码如下:

lengths = []
for i in range(9):
  lengths.append(symmetry_indices[2*i+1] - symmetry_indices[2*i])

希望以上代码能够帮助到你。

提供参考实例方法:【python】最优化方法之一维搜索(黄金分割法+斐波那契法),链接:https://blog.csdn.net/weixin_44044411/article/details/88091024?spm=1001.2101.3001.6650.10&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-10-88091024-blog-127679261.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-10-88091024-blog-127679261.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=12

思路可能不对, 仅供参考:
代码:

train_data = [95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 87975.0, 84150.0, 81600.0, 86955.0, 88740.0, 89760.0, 90270.0, 90270.0, 88230.0, 83130.0, 84405.0, 86955.0, 87975.0, 88485.0, 86955.0, 82110.0, 78540.0, 83130.0, 85425.0, 85935.0, 85170.0, 80325.0, 76755.0, 78030.0, 82875.0, 84150.0, 84150.0, 81600.0, 75735.0, 75480.0, 80325.0, 80070.0, 81600.0, 81600.0, 80070.0, 75225.0, 72165.0, 75735.0, 78540.0, 81345.0, 80070.0, 81090.0, 75480.0, 72675.0, 71655.0, 75480.0, 78030.0, 77775.0, 79560.0, 79560.0, 77265.0, 73950.0, 71910.0, 73440.0, 75225.0, 76500.0, 77010.0, 78285.0, 79050.0, 78795.0, 75225.0, 71655.0, 68850.0, 71145.0, 74715.0, 74460.0, 76245.0, 77010.0, 77010.0, 77265.0, 77775.0, 78285.0, 77775.0, 77775.0, 78285.0, 78795.0, 79560.0, 78795.0, 78795.0, 79560.0, 80835.0, 80325.0, 80325.0, 80325.0, 81600.0, 80070.0, 81345.0, 81855.0, 80835.0, 81600.0, 80325.0, 82110.0, 81855.0, 81345.0, 81855.0, 81855.0, 81345.0, 82110.0, 82875.0, 81855.0, 81855.0, 83385.0, 82620.0, 82365.0, 82365.0, 81855.0, 82875.0, 82875.0, 83640.0, 83385.0, 83130.0, 82620.0, 82875.0, 82620.0, 82365.0, 83130.0, 83640.0, 82620.0, 82620.0, 83640.0, 83130.0, 82875.0, 82365.0, 83895.0, 82365.0, 83130.0, 82620.0, 82620.0, 82110.0, 81855.0, 81855.0, 82620.0, 82875.0, 83385.0, 83640.0, 83640.0, 82875.0, 82620.0, 85935.0, 87465.0, 86190.0, 81855.0, 67065.0, 51765.0, 62730.0, 83640.0, 85680.0, 84405.0, 83640.0, 83130.0, 83130.0, 82620.0, 82365.0, 82110.0, 81855.0, 82875.0, 83640.0, 82875.0, 83385.0, 83895.0, 83640.0, 82875.0, 83130.0, 82620.0, 83385.0, 83385.0, 82365.0, 82365.0, 82110.0, 83130.0, 82620.0, 80580.0, 80835.0, 82365.0, 82365.0, 81345.0, 81855.0, 81855.0, 81600.0, 82365.0, 80580.0, 81600.0, 81345.0, 80070.0, 81090.0, 81090.0, 82110.0, 81345.0, 80580.0, 79815.0, 81090.0, 80580.0, 81345.0, 79305.0, 80580.0, 79815.0, 81090.0, 80070.0, 79560.0, 80070.0, 79560.0, 80070.0, 80325.0, 79560.0, 79560.0, 79560.0, 78795.0, 78285.0, 78540.0, 77520.0, 78030.0, 77775.0, 76245.0, 77265.0, 76755.0, 75225.0, 75735.0, 74970.0, 72420.0, 70890.0, 68595.0, 70635.0, 73695.0, 76500.0, 78030.0, 77010.0, 76755.0, 75225.0, 71910.0, 69360.0, 70380.0, 73695.0, 78795.0, 78285.0, 75225.0, 76245.0, 73185.0, 71400.0, 73440.0, 76755.0, 80580.0, 79560.0, 78030.0, 77265.0, 73695.0, 72930.0, 75990.0, 80070.0, 79815.0, 80325.0, 78540.0, 73185.0, 76245.0, 81090.0, 82620.0, 82365.0, 80835.0, 77775.0, 77775.0, 81090.0, 84150.0, 84150.0, 83640.0, 78795.0, 79815.0, 84405.0, 86445.0, 86445.0, 83640.0, 79560.0, 82620.0, 88485.0, 88740.0, 87210.0, 83130.0, 82875.0, 87210.0, 89250.0, 87720.0, 86190.0, 81345.0, 84405.0, 88230.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0, 95625.0]

# 思路: 假定某个点是中心点, 找对称点的总数量大于某个值(这个值可以预估, 比如100)

for i in range(len(train_data)):
    # i 是中心点索引
    # print(i)
    count = 0
    indexList = []
    dataList = []
    for j in range(i):
        if 2*i-j < len(train_data) and train_data[j] == train_data[2*i-j]:
            count += 1
            indexList.append((j, 2*i-j, 2*i-j - j))   # 对称点索引及差值
            dataList.append((j, train_data[j]))  # 存储对称点, 用于验证数据
            dataList.append((2*i-j, train_data[2*i-j]))
    if count >= 100:
        print(i)
        print(indexList)
        dataList.sort(key=lambda x: x[0])    # 排序
        print(dataList)
        break   # 停止查询






输出:

231
[(0, 462, 462), (1, 461, 460), (2, 460, 458), (3, 459, 456), (4, 458, 454), (5, 457, 452), (6, 456, 450), (7, 455, 448), (8, 454, 446), (9, 453, 444), (10, 452, 442), (11, 451, 440), (12, 450, 438), (13, 449, 436), (14, 448, 434), (15, 447, 432), (16, 446, 430), (17, 445, 428), (18, 444, 426), (19, 443, 424), (20, 442, 422), (21, 441, 420), (22, 440, 418), (23, 439, 416), (24, 438, 414), (25, 437, 412), (26, 436, 410), (27, 435, 408), (28, 434, 406), (29, 433, 404), (30, 432, 402), (31, 431, 400), (32, 430, 398), (33, 429, 396), (34, 428, 394), (35, 427, 392), (36, 426, 390), (37, 425, 388), (38, 424, 386), (39, 423, 384), (40, 422, 382), (41, 421, 380), (42, 420, 378), (43, 419, 376), (44, 418, 374), (45, 417, 372), (46, 416, 370), (47, 415, 368), (48, 414, 366), (49, 413, 364), (50, 412, 362), (51, 411, 360), (52, 410, 358), (53, 409, 356), (54, 408, 354), (55, 407, 352), (56, 406, 350), (57, 405, 348), (58, 404, 346), (59, 403, 344), (60, 402, 342), (61, 401, 340), (62, 400, 338), (63, 399, 336), (64, 398, 334), (65, 397, 332), (66, 396, 330), (67, 395, 328), (68, 394, 326), (69, 393, 324), (70, 392, 322), (71, 391, 320), (72, 390, 318), (73, 389, 316), (74, 388, 314), (75, 387, 312), (76, 386, 310), (77, 385, 308), (78, 384, 306), (79, 383, 304), (80, 382, 302), (81, 381, 300), (82, 380, 298), (83, 379, 296), (84, 378, 294), (85, 377, 292), (86, 376, 290), (87, 375, 288), (88, 374, 286), (89, 373, 284), (159, 303, 144), (169, 293, 124), (175, 287, 112), (193, 269, 76), (195, 267, 72), (210, 252, 42), (211, 251, 40), (213, 249, 36), (221, 241, 20), (224, 238, 14)]
None

Process finished with exit code 0

对称点画图:

img

以下是如何在数据中找到对称点对的索引和长度的示例:

def find_symmetry(data):
    indices = []
    lengths = []
    
    # Iterate through the data in pairs
    for i in range(len(data) // 2):
        # Check if the current pair is symmetrical
        if data[i] == data[-i-1]:
            indices.append(i)
            lengths.append(2)
    
    return indices, lengths

indices, lengths = find_symmetry(train_data)

print(f'Indices of symmetrical points: {indices}')
print(f'Lengths of symmetrical pairs: {lengths}')

该代码将在数据中找到对称点对,并将每对中第一个点的索引存储在索引列表中,将每对的长度存储在长度列表中。输出将类似于:

Indices of symmetrical points: [0, 1, 2, 3, 4, 5, 6, 7, 8]
Lengths of symmetrical pairs: [2, 2, 2, 2, 2, 2, 2, 2, 2]

仅供参考,望采纳,谢谢。

你好,这是一段代码实现上述功能的例子。这里假设数据保存在一个名为 data 的列表中:

symmetry_pairs = []
for i in range(len(data)):
    for j in range(i+1, len(data)):
        if data[i] == data[j]:
            symmetry_pairs.append((i, j))

lengths = [j - i for i, j in symmetry_pairs]

这段代码会找出 data 中所有对称点的索引值对,并计算出每对点之间的长度。例如,如果 data 为 [1, 2, 3, 2, 1],那么 symmetry_pairs 会变成 [(0, 4), (1, 3)],lengths 会变成 [4, 2]。

下面是一个实现,该实现的算法时间复杂度为 O(n):

from scipy import signal

def find_symmetry(data):
  # 应用中值滤波
  filtered_data = signal.medfilt(data)
  # 初始化结果数组
  result = []
  # 遍历数据的前半部分
  for i in range(len(filtered_data) // 2):
    # 如果数据的第 i 个位置的值和数据的倒数第 i 个位置的值相等
    if filtered_data[i] == filtered_data[-i - 1]:
      # 将索引差添加到结果数组中
      result.append(i - len(filtered_data) // 2)
  return result

# 测试示例
print(find_symmetry(train_data))

在这个实现中,我们使用了 scipy 库的 medfilt 函数来对数据进行中值滤波。然后我们遍历过滤后的数据的前半部分,并计算出每一对对称的数据在数组中的索引差,最后将它们添加到结果数组中。

注意:如果要使用上面的代码,需要先安装 scipy 库,可以使用以下命令进行安装:

pip install scipy

另外,如果中心点不在最中央,可以考虑找到数据的中位数,并将数据平移到中位数处,然后再使用上面的代码进行计算。可以使用以下代码来实现:

import numpy as np

def find_symmetry(data):

#计算数据的中位数
median = np.median(data)

#将数据平移到中位数处
shifted_data = data - median

#应用中值滤波
filtered_data = signal.medfilt(shifted_data)

#初始化结果数组
result = []

#遍历数据的前半部分
for i in range(len(filtered_data) // 2):
# 如果数据的第 i 个位置的值和数据的倒数第 i 个位置的值相等
if filtered_data[i] == filtered_data[-i - 1]:
# 将索引差添加到结果数组中
result.append(i - len(filtered_data) // 2)
return result

#测试示例
print(find_symmetry(train_data))

在这个实现中,我们使用了 numpy 库的 median 函数来计算数据的中位数,然后使用平移操作将数据平移到中位数处。接下来使用 scipy 库的 medfilt 函数对数据进行中值滤波,最后计算出每一对对称的数据在数组中的索引差,并将它们添加到结果数组中。

注意:如果要使用上面的代码,需要先安装 numpy 和 scipy 库,可以使用以下命令进行安装:

pip install numpy scipy

希望对您有所帮助。望采纳。

以下是一种可行的方法:

1、将数据从中心开始分成9组,例如第1组是train_data[0]到train_data[8],第2组是train_data[1]到train_data[9],以此类推。
2、对于每一组,计算其中点的索引值。例如,第1组的中点索引值是(0+8)/2=4。
3、对于每一组,计算索引值最大的点和索引值最小的点的索引值差。例如,第1组的索引值最大的点是train_data[8],索引值最小的点是train_data[0],差值是8-0=8。
4、将每一组的差值相加,得到总的差值。

代码示例如下:

n = len(train_data)
group_size = n // 9

# 初始化总的差值
total_diff = 0

for i in range(9):
  # 计算中点索引值
  mid_index = (i + 0.5) * group_size

  # 计算索引值最大的点和索引值最小的点的索引值差
  diff = int(mid_index + group_size - 1) - int(mid_index)

  # 累加差值
  total_diff += diff

# 输出总的差值
print(total_diff)

希望这能帮到您。