栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

迭代器链接梯度最小方向

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

迭代器链接梯度最小方向

import os
from astropy.io import fits
import numpy as np
import matplotlib.pyplot as plt
def dictSortByKeys(dict):
    """
    输入一个字典,按键的大小将字典进行从小到大排序并返回新的字典
    :return:
    """
    sortedList = sorted(dict.items(), key=lambda x: x[0], reverse=False)
    dict = {i[0]: i[1] for i in sortedList}
    return dict
def dictSortByKValues(dict):
    """
    输入一个字典,按值的大小将字典进行从小到大排序并返回新的字典
    :return:
    """
    sortedList = sorted(dict.items(), key=lambda x: x[1], reverse=False)
    dict = {i[0]: i[1] for i in sortedList}
    return dict
def findDictKeysByValue(dict, values):
    """
    :param dict: 输入一个字典
    :param values: 输入这个字典中你想找到对应键的值
    :return: 返回对应的键
    """
    valueKeyDict = {i[1]: i[0] for i in dict.items()}
    return valueKeyDict[values]
def maxPoint(data):
    """
    找一个二维矩阵的最大值以及最大值所在的行与列
    """
    maxValue = data.max()
    maxPoint = np.where(data == maxValue)
    maxPointRow = maxPoint[0][0]
    maxPointColumn = maxPoint[1][0]
    return (maxPointRow, maxPointColumn)
class PlotGradient():
    def __init__(self, data, row, column):
        self.data = data
        self.maxRow, self.maxColumn = row,column
    def __iter__(self):
        return self
    def __next__(self):
        data = self.data
        shape = data.shape
        maxPointRow = self.maxRow
        maxPointColumn = self.maxColumn
        nextPonitCoord = {"center": [maxPointRow, maxPointColumn]
            , "left": [maxPointRow, maxPointColumn - 1]
            , "lefttop": [maxPointRow - 1, maxPointColumn - 1]
            , "top": [maxPointRow - 1, maxPointColumn]
            , "righttop": [maxPointRow - 1, maxPointColumn + 1]
            , "right": [maxPointRow, maxPointColumn + 1]
            , "rightbottom": [maxPointRow + 1, maxPointColumn + 1]
            , "bottom": [maxPointRow + 1, maxPointColumn]
            , "leftbottom": [maxPointRow + 1, maxPointColumn - 1]
                          }
        nextPonitValues = {"center": data[maxPointRow, maxPointColumn]
            , "left": data[maxPointRow, maxPointColumn - 1]
            , "lefttop": data[maxPointRow - 1, maxPointColumn - 1]
            , "top": data[maxPointRow - 1, maxPointColumn]
            , "righttop": data[maxPointRow - 1, maxPointColumn + 1]
            , "right": data[maxPointRow, maxPointColumn + 1]
            , "rightbottom": data[maxPointRow + 1, maxPointColumn + 1]
            , "bottom": data[maxPointRow + 1, maxPointColumn]
            , "leftbottom": data[maxPointRow + 1, maxPointColumn - 1]
                           }
        centerValue = nextPonitValues["center"]  # 中心值
        sortedValues = sorted(nextPonitValues.values())  # 按照值从大到小的顺寻将字典中9个元素进行排序
        centerValueIndex = sortedValues.index(centerValue)  # 获得中心值在数值构成的列表中的索引
        nextValuesIndex = centerValueIndex - 1  # 我们要找的是仅小于中心值的那个值,在这里获得它索引
        # print(nextValuesIndex)
        nextValue = sortedValues[nextValuesIndex]  # 仅小于中心值的值
        nextValuekey = findDictKeysByValue(nextPonitValues, nextValue)  # 通过这个仅小于中心值的数来找到它在中心值得什么位置
        nextRow, nextColumn = nextPonitCoord[nextValuekey]  # 返回仅小于中心值的数的坐标(行,列)
        self.maxRow, self.maxColumn = nextRow, nextColumn
        if self.maxRow == 1 or self.maxColumn == 1 or self.maxRow == shape[0] - 1 or self.maxColumn == shape[
            1] - 1 or centerValueIndex == 0:
            raise StopIteration()
        # print(nextRow, nextColumn)
        return nextRow, nextColumn
if __name__ == "__main__":
    with fits.open('Mrk501.fits') as hdul:
        data = hdul[0].data
        shape = data.shape
        data = data.reshape([shape[2], shape[3]])
        maxRow, maxColumn = maxPoint(data)
        point = list(PlotGradient(data, maxRow, maxColumn))
        fig, ax = plt.subplots()
        ax.imshow(data, cmap='nipy_spectral_r', origin='lower')
        x = [maxColumn]
        y = [maxRow]
        for i in point:
            x.append(i[1])
            y.append(i[0])
        ax.plot(x, y)
        ax.scatter(x, y, s=2, c='white')
        plt.show()








转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/503528.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号