首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跨越正交向量的算法: Python

跨越正交向量的算法: Python
EN

Code Review用户
提问于 2019-09-18 13:34:05
回答 4查看 2.4K关注 0票数 12

该守则由三个功能组成:

  1. 跨任意向量(以维数作为参数)
  2. 与论点中传递的向量正交的向量
  3. 在两个向量之间找到交叉积。

守则如下:

代码语言:javascript
复制
def span_vector(n):
    '''n represents dimension of the vector.'''
    return [random.randrange(-1000,1000) for x in range(n)]


def span_orthogonal(vec):
    '''vec represents n-dimensional vector'''
    '''Function spans an arbitrary vector that is orthogonal to vec'''

    dimension = len(vec)
    orthogonal_vec = []
    for k in range(dimension-1):
        orthogonal_vec.append(random.randrange(-1000,1000))
    last_k = ((-1)*sum([vec[x]*orthogonal_vec[x] for x in range(dimension-1)]))/vec[-1]
    orthogonal_vec.append(last_k)
    return orthogonal_vec

def cross_product(v1,v2):
    return sum(v1[x]*v2[x] for x in range(len(v1)))

还有什么可以改进的?

编辑最后一个函数必须读取dot_product,而不是cross_product。我犯了一个错。

EN

回答 4

Code Review用户

回答已采纳

发布于 2019-09-18 13:49:41

您可能应该使用Numpy,尽管我对您的情况还不太了解,无法进一步发表评论。

假设您需要保留“纯Python",则可以进行以下改进:

否定

(-1)*替换为-

发生器

for k in range(dimension-1):循环替换为

代码语言:javascript
复制
orthogonal_vec = [
    random.randrange(-1000,1000)
    for _ in range(dimension-1)
]

类型提示

n: intvec: typing.Sequence[float] (可能)。前两个函数返回-> typing.List[float]cross_product既接受又返回float

内部列表

代码语言:javascript
复制
sum([ ... ])

不应该使用内部列表。只需将生成器直接传递给sum即可。

票数 11
EN

Code Review用户

发布于 2019-09-18 14:48:05

这只是@莱因德林已经写过的关于您的代码的一个小小的观察。

编写函数文档,就像您用

代码语言:javascript
复制
def span_orthogonal(vec):
    '''vec represents n-dimensional vector'''
    '''Function spans an arbitrary vector that is orthogonal to vec'''

不像预期的那样工作。

如果你使用help(span_orthogonal),你会看到

代码语言:javascript
复制
Help on function span_orthogonal in module __main__:

span_orthogonal(vec)
    vec represents n-dimensional vector

原因是只有第一个文本块被解释为文档。另外,通常的惯例是编写“反向”的文档,我的意思是首先对您的函数做一个简短的总结,而不是继续提供诸如预期输入之类的细节。这两个方面也可以在臭名昭著的官方Python代码样式指南 (又名PEP 8)的文档字符串一节中找到。

使用

代码语言:javascript
复制
def span_orthogonal(vec):
    '''Function spans an arbitrary vector that is orthogonal to vec

    vec represents n-dimensional vector
    '''

打电话给help(...)

代码语言:javascript
复制
Help on function span_orthogonal in module __main__:

span_orthogonal(vec)
    Function spans an arbitrary vector that is orthogonal to vec

    vec represents n-dimensional vector

另外,由于@Reinderien也暗示您要使用numpy,所以让我告诉您,在科学Python堆栈中也经常使用“特殊”文档惯例(又名农比多)。

举个例子:

代码语言:javascript
复制
def span_orthogonal(vec):
    '''Function spans an arbitrary vector that is orthogonal to vec

    Parameters
    ----------
    vec : array_like
        represents n-dimensional vector
    '''

这种样式更接近于当前Python版本中的类型提示,因为它更结构化。numpydoc背后的想法是使用像狮身人面像这样的工具来促进自动文档生成,但这有点超出了我在这里试图传达的内容。

票数 10
EN

Code Review用户

发布于 2019-09-18 17:38:20

除了前面提到的@Reinderein和@AlexV之外,您还可以在代码中添加以下内容,以提供一个完整的可运行示例:

在顶端:

代码语言:javascript
复制
import random

在他的底部,就像:

代码语言:javascript
复制
def main():
    v1 = span_vector(3)
    v2 = span_orthogonal(v1)
    print(v1)
    print(v2)
    print(cross_product(v1,v2))

if __name__ == '__main__':
    main()

对于1000's (在-1000中),您可以使用一个“常量”:

代码语言:javascript
复制
MAX_COOR_VAL = 1000

(cross)dot_product(v1,v2)的定义可以更清晰一些,与span_orthogonal(vec)更一致:

代码语言:javascript
复制
def dot_product(vec1, vec2):

方法span_orthogonal(vec)不是防弹的,当vec等于[1,0]时,它可能会导致ZeroDivisionError异常,而orthogonal_vec的随机创建恰好是[1] (或[2])。

票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档