Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >改进Python类“准确性”的设计

改进Python类“准确性”的设计
EN

Code Review用户
提问于 2013-03-14 11:27:14
回答 2查看 164关注 0票数 4

我正在学习Python中的类和方法。

类精度是基于shapely模块的参考多边形和一个或多个分段多边形之间的几个统计值(总共13)的一类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from numpy import average

#some stat

def ra_or(ref, seg):
    return average([(ref.intersection(s).area/ref.area) for s in seg])


def ra_os(ref, seg):
    return average([(ref.intersection(s).area/s.area) for s in seg])


def sim_size(ref, seg):
return average([(min(ref.area, s.area)/max(ref.area,s.area)) for s in seg])


def AFI(ref,seg):
   return (ref.area - max([s.area for s in seg]))/ref.area

其中ref.intersection(s).areareferencesegmented polygon-i之间的交集区域。

我的课程设计(非常基本,而且可能需要改进)是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Accuracy(object):
    def __init__ (self,ref,seg = None, noData = -9999):
        if seg == None:
            self.area = ref.area
            self.perimeter = ref.length
            self.centroidX = ref.centroid.x
            self.centroidY = ref.centroid.y
            self.data =  [self.centroidX,
                        self.centroidY,
                        self.area,
                        self.perimeter,
                        noData,
                        noData,
                        noData,
                        noData,
                        noData]
        else:
            self.area = ref.area
            self.perimeter = ref.length
            self.centroidX = ref.centroid.x
            self.centroidY = ref.centroid.y
            self.segments = len(seg)
            self.RAor = ra_or(ref,seg)
            self.RAos = ra_os(ref,seg)
            self.SimSize = sim_size(ref,seg)
            self.AFI = AFI(ref,seg)
            self.data = [self.centroidX,
                        self.centroidY,
                        self.area,
                        self.perimeter,
                        self.segments,
                        self.RAor,
                        self.RAos,
                        self.SimSize,
                        self.AFI]

from shapely.geometry import Polygon

p1 = Polygon([(2, 4), (4, 4), (4, 2), (2, 2), (2, 4)])
p2 = Polygon([(0, 3), (3, 3), (3, 0), (0, 0), (0, 3)])

accp1 = Accuracy(p1,[p2])
accp1.data
[3.0, 3.0, 4.0, 8.0, 1, 0.25, 0.1111111111111111, 0.44444444444444442, -1.25]

accp1 = Accuracy(p1)
accp1.data
[3.0, 3.0, 4.0, 8.0, -9999, -9999, -9999, -9999, -9999]
EN

回答 2

Code Review用户

回答已采纳

发布于 2013-03-14 11:55:24

如果计划将四个函数( ra_orra_ossim_sizeAFI )调用到Accuracy之外,那么最好将它们保留为函数。如果只有通过Accuracy才能调用它们,那么就应该使用方法。

类可以帮助组织复杂的代码,但是它们通常不会使代码更快。除非有明显的优势,否则不要使用类--通过继承或多态等等。

如果您想要使用更少内存的更快的代码,请避免在这里使用类。只需为每个属性定义函数即可。

如果您想要“豪华”语法--通过属性引用每个统计数据的能力,那么类就可以了。

如果您计划实例化Accuracy的实例,但并不总是访问所有属性,则不需要在__init__中计算它们。您可以使用属性延迟它们的计算。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @property
 def area(self):
    return self.ref.area

注意,当您编写accp1.area时,上面的area方法将被调用。注意,在accp1.area之后没有括号。

需要明确的是,使用属性的好处是,Accuracy的每个实例在需要统计属性之前都不会计算它们的所有统计属性。使用属性的缺点是,每次访问属性时都会重新计算它们。如果self.refself.seg发生变化,这可能不是一个不利因素。

此外,您可以使用丹尼斯·奥特卡达的CachedAttribute装饰师.缓存结果,然后只计算属性一次,然后每次只查找一次。

不要对noData (如noData = -9999 )使用任意的值。使用noData = np.nan,或者直接跳过noData并直接使用np.nan

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
from shapely.geometry import Polygon
nan = np.nan

class Accuracy(object):
    def __init__(self, ref, seg=None):
        self.ref = ref
        self.seg = seg

    @property
    def area(self):
        return self.ref.area

    @property
    def perimeter(self):
        return self.ref.length

    @property
    def centroidX(self):
        return self.ref.centroid.x

    @property
    def centroidY(self):
        return self.ref.centroid.y

    @property
    def data(self):
        return [self.centroidX,
                self.centroidY,
                self.area,
                self.perimeter,
                self.segments,
                self.RAor,
                self.RAos,
                self.SimSize,
                self.AFI]

    @property
    def segments(self):
        if self.seg:
            return len(self.seg)
        else:
            return nan

    @property
    def RAor(self):
        if self.seg:
            return np.average(
                [(self.ref.intersection(s).area / self.ref.area) for s in self.seg])
        else:
            return nan

    @property
    def RAos(self):
        if self.seg:
            return np.average(
                [(self.ref.intersection(s).area / s.area) for s in self.seg])
        else:
            return nan

    @property
    def SimSize(self):
        if self.seg:
            return np.average(
                [(min(self.ref.area, s.area) / max(self.ref.area, s.area))
                 for s in self.seg])
        else:
            return nan

    @property
    def AFI(self):
        if self.seg:
            return (self.ref.area - max([s.area for s in self.seg])) / self.ref.area
        else:
            return nan

p1 = Polygon([(2, 4), (4, 4), (4, 2), (2, 2), (2, 4)])
p2 = Polygon([(0, 3), (3, 3), (3, 0), (0, 0), (0, 3)])

accp1 = Accuracy(p1, [p2])
print(accp1.data)
# [3.0, 3.0, 4.0, 8.0, 1, 0.25, 0.1111111111111111, 0.44444444444444442, -1.25]

accp1 = Accuracy(p1)
print(accp1.data)
# [3.0, 3.0, 4.0, 8.0, nan, nan, nan, nan, nan]

下面是如何将数据(作为numpy数组)保存到CSV文件中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
np.savetxt('/tmp/mytest.txt', np.atleast_2d(accp1.data), delimiter=',')

下面是你怎么把它读回来的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data = np.genfromtxt('/tmp/mytest.txt', dtype=None)
print(data)
# [  3.   3.   4.   8.  nan  nan  nan  nan  nan]
票数 2
EN

Code Review用户

发布于 2013-03-21 16:24:04

我对待这个类的方式和unutbu一样,只是将多边形存储为类的属性,并使用属性和方法进行分析。我认为唯一不同的做法是将其实现为多边形的一个子类,因此任何给定的实例都可以根据需要将自己与任何其他多边形进行比较。我不打算勾勒出细节,但我希望它能像这样工作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sp1 = SmartPolygon([(2, 4), (4, 4), (4, 2), (2, 2), (2, 4)])
sp2 = SmartPolygon([(0, 3), (3, 3), (3, 0), (0, 0), (0, 3)])

sp1.accuracy()
>>> (3.0, 3.0, 4.0, 8.0, nan, nan, nan, nan, nan)

sp1.accuracy(sp2)
>>> (3.0, 3.0, 4.0, 8.0, 1, 0.25, 0.1111111111111111, 0.44444444444444442, -1.25)

其他想法,没有特别的顺序:

作为它自己的类,我个人会使用不同的名称。“‘Accuracy”是你想从对象身上学到的东西的一个方面,但并不能真正代表对象是什么。我将这个类称为类似于PolygonComparison的类,或者称为描述性的,但理想情况下更简洁。我不知道这是否正式是毕达通的,但我认为类是名词,函数/方法是动词,通常这样命名。

你的风格中有一些细微的不一致之处,主要是因为有时在你不该使用的地方加上空格,反之亦然。这些通常不会影响您的代码如何运行,但更多的是可读性、可理解性和可调试性。例如,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def __init__ (self,ref,seg = None, noData = -9999):
# Note spacing:   ^   ^    ^              ^

通常被写成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def __init__(self, ref, seg=None, noData=-9999):

然后,简单地看一下,该方法有三个参数,其中两个参数具有默认值。我建议看一下PEP 8风格的指南。

最后,请注意,您的__init__方法中有一些冗余:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def __init__(self, ref, seg=None):
    if seg == None:
        self.area = ref.area
        self.perimeter = ref.length
        self.centroidX = ref.centroid.x
        self.centroidY = ref.centroid.y
        ... # etc.
    else:
        self.area = ref.area
        self.perimeter = ref.length
        self.centroidX = ref.centroid.x
        self.centroidY = ref.centroid.y
        ...

可以减少到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def __init__(self, ref, seg=None):
    self.area = ref.area
    self.perimeter = ref.length
    self.centroidX = ref.centroid.x
    self.centroidY = ref.centroid.y

    # Typically you check if something *is* None, rather than *equals* None.
    if seg is None:
        ...
    else:
        ...
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/23929

复制
相关文章
改进后的日志类CLogger
在原有的基础上增加了module_name,表示模块名,当一个系统由多模块组成时,输出的日志将更加清晰,使用方法,以MOOON-agent中的为例:
一见
2018/08/07
4000
Python如何设计面向对象的类(上)
Python是一门高级语言,支持面向对象设计,如何设计一个符合Python风格的面向对象的类,是一个比较复杂的问题,本文提供一个参考,表达一种思路,探究一层原理。
dongfanger
2021/07/08
9420
苹果 AirDrop 的设计缺陷与改进
Apple 的离线文件共享服务 AirDrop 已集成到全球超过 15 亿的终端用户设备中。 本研究发现了底层协议中的两个设计缺陷,这些缺陷允许攻击者了解发送方和接收方设备的电话号码和电子邮件地址。 作为补救,本文研究了隐私保护集合交集(Private Set Intersection)对相互身份验证的适用性,这类似于即时消息程序中的联系人发现。 本文提出了一种新的基于 PSI 的优化协议称为 PrivateDrop,它解决了离线资源受限操作的具体挑战,并集成到当前的 AirDrop 协议栈中。 实验证PrivateDrop保留了AirDrop的用户体验,身份验证延迟远低于一秒。PrivateDrop目前已开源(https://github.com/seemoo-lab/privatedrop )。
CDra90n
2023/06/27
7520
苹果 AirDrop 的设计缺陷与改进
Python 的元类设计起源自哪里?
一个元老级的 Python 核心开发者曾建议我们( 点击阅读),应该广泛学习其它编程语言的优秀特性,从而提升 Python 在相关领域的能力。在关于元编程方面,他的建议是学习 Hy 和 Ruby。但是,他也提到,他并不知道学习哪种语言,可以加深对 Python 元类设计的理解。
Python猫
2021/12/22
4080
Python如何设计面向对象的类(下)
本文将在上篇文章二维向量Vector2d类的基础上,定义表示多维向量的Vector类。
dongfanger
2021/07/20
5490
Python学习笔记整理(十六) 类的设计
如何使用类来对有用的对象进行建模? 一、Python和OOP Python和OOP实现可以概括为三个概念。 继承     继承是基于Python中属性查找(在X.name表达式中) 多态     在X.method方法中,method的意义取决于X的类型(类) 封装     方法和运算符实现行为,数据隐藏默认是一种惯例。 封装指的是在Python中打包,也就是把实现的细节隐藏在对象接口之后。这并不代表有强制的私有性。封装可以让对象接口的现实 出现变动时,不影响这个对象的用户。 1、不要通过调用标记进行重载 不要在同一个类中对同一个方法名定义两次,后面的会覆盖前面,也不要对对象类型进行测试。应该把程序代码写成预期的对象接口。而不是特定类型的数据类型。 2、类作为记录 通过类的实例来创建多个记录。 3、类和继承:是“一个”关系 (is a) 从程序员的角度来看,继承是由属性点号运算启动的,由此触发实例,类以及任何超类中变量名搜索。 从设计师的角度看,继承是一种定义集合成员关系的方式:类定义了一组内容属性,可由更具体的集合(子类)继承和定制。 子类和超类的继承是1对1的关系. PizzaRobot是一种Chef,Chef是一种Employee.以OOP术语来看,我们称这些关系为“是一个连接”(is a):机器人是个主厨,主厨是一个员工。 class Employee:         def __init__(self,name,salary=0):                 self.name=name                 self.salary=salary         def giveRaise(self,percent):                 self.salary=self.salary+(self.salary*percent)         def work(self):                 print self.name,"does stuff"         def __repr__(self):                 return "<Employee:name=%s,salary=%s>" % (self.name,self.salary) class Chef(Employee):         def __init__(self,name):                 Employee.__init__(self,name,5000)         def work(self):                 print self.name,"make food" class Server(Employee):         def __init__(self,name):                 Employee.__init__(self,name,40000)         def work(self):                 print self.name,"interface with customer" class PizzaRobot(Chef):            def __init__(self,name):#有点想不明白,既然继承就够了,为什么还要在这里构造                 Chef.__init__(self,name)    #Chef.__init__(self,name) =》Employee.__init__(self,name,5000)=>__init__(self,name,salary=0)         def work(self):                 print self.name,"make pizza" if __name__=='__main__':         bob=PizzaRobot('bob')         print bob         bob.work()         bob.giveRaise(0.20)         print bob;print # python employees.py   <Employee:name=bob,salary=5000> bob make pizza <Employee:name=bob,salary=6000.0> 理解有问题的地方 class PizzaRobot(Chef):            def __init__(self,name):#有点想不明白,既然继承就够了,为什么还要在这里构造,下面拿掉这里做对比   
py3study
2020/01/09
7250
CI/CD 改进方案设计
在面对不同环境(例如虚拟机、容器、集群)时,选择适合的 CI/CD 工作流程是至关重要的。以下是针对不同环境的一些常见的 CI/CD 工作流程选择:
行者深蓝
2024/03/12
2870
数据库资源的改进设计
今天在和同事聊系统配置的时候,突然联想到一个问题,问题的背景是对于磁盘的使用情况,是希望在独占模式下做到定制化配置还是作为一种统一的配置方式管理,简单来说,就是对于数据库服务器的磁盘配置,是根据磁盘来映射特定的服务器还是把服务器磁盘统一规划起来,用一个统一的分区或者卷来提供服务。
jeanron100
2019/05/08
4750
数据库资源的改进设计
无监督:聚类与改进聚类详解
聚类: 聚类就是将相似的对象聚在一起的过程。如总统大选,选择那部分容易转换立场的表决者,进行针对性的宣传,可以扭转局势。 聚类将相似的对象归到同一簇中,相似取决于相似度度量方法。 K-means聚类,可能收敛到局部最小值,在大规模数据集上收敛较慢。 K-means聚类:首先,随机确定k个初始点作为质心,将数据集中的每个点分配到一个簇中,即选择一个最近的质心进行分配,而后每个簇的质心更新为该簇所有点的平均值。 直到类间距离足够大,类内距离足够小。 随机初始化质心时,必须找到数据集的边界,通过找到数
微风、掠过
2018/04/10
9860
CI/CD 改进方案设计
这是一个基于您的要求详细扩展的 CI/CD 改进方案设计。该设计旨在支持 Kubernetes (K8s) 和虚拟机 (VM) 环境中的应用程序部署,并利用 GitHub Actions 和 Jenkins 实现 CI/CD 流程。
行者深蓝
2024/03/12
1560
利用Python提升终端输入命令的准确性
终端输入一个命令,相当于一个字符串。如何检查输入是否正确,需要平时多练习,这里提供一个思路。利用python写一个函数来判断。利用python的切片功能,很方便的从字符串中遍历单个字符,并利用ord()函数获取其对应的ASCII 数值,或者 Unicode 数值。具体代码如下:
fem178
2022/05/05
3660
IP的准确性
最近游戏项目中更新机制有所修改,游戏启动时会从cdn上读取一个文件(约60B),但是后台异常收集系统中发现很多玩家请求不了该文件(libcurl的get请求),返回的error code有很多种,以6、22、28、56居多。
meteoric
2018/11/19
1K0
python3.x的改进
Python 3.x 起始版本是Python 3.0,目前的最新版本是 3.3.3
py3study
2020/01/03
7000
Python 关于类函数设计的一点总结
def get_files_in_dirpath(self, dirpath):
授客
2019/09/10
3320
Python 关于类函数设计的一点总结
巧用Python 枚举类设计状态码信息
单独利用一个字典进行状态码信息对照,这样设计一旦状态码多了就不好对照,再使用过程中也没那么方便,简单试下组织一个成功的信息
忆想不到的晖
2021/12/06
9720
Python「面向对象」类和对象的基本概念和关系、类的设计方法
类就相当于制造飞机时的图纸,是一个模板,是负责创建对象的,这张图纸并不能让飞机起飞,得先制造出飞机有驾驶员条件。
python自学网
2022/06/20
1.4K0
Python「面向对象」类和对象的基本概念和关系、类的设计方法
设计模式之module模式及其改进
okaychen
2018/01/05
6190
设计模式之module模式及其改进
CI/CD 改进方案设计-App 通用chart包设计
在现代云原生应用部署和管理中,Helm 和 Helmfile 作为 Kubernetes 的包管理工具,扮演着至关重要的角色。为了提升部署效率和应用的可维护性,我们提出了 App 通用 Chart 包设计方案。本文将详细解释设计原则、设计目标以及如何使用我们的通用 Chart 包来简化应用部署流程。
行者深蓝
2024/03/18
1630
RT-DETR改进:新的设计范式Slim Neck助力RT-DETR | Neck改进
本文独家改进: 采用 GSConv 方法的 Slim-Neck 可缓解 DSC 缺陷对模型的负面影响,并充分利用深度可分离卷积 DSC 的优势,引入RT-DETR二次创新;
AI小怪兽
2023/11/20
8890
iOS缓存类的设计
使用执行速度缓存的程序可以大大提高程序,设计一个简单的缓存类并不需要太复杂的逻辑. 只需要一个简单的3接口.
全栈程序员站长
2022/07/06
3750
iOS缓存类的设计

相似问题

改进了该程序的设计。

20

结构化密钥的改进设计

10

Python游戏的改进?

10

树索引类的改进

10

类:如何提高C++的准确性?

40
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文