小编hbr*_*tow的帖子

Numpy广播切片阵列和向量

给定三个numpy数组:一个多维数组x,一个y具有尾随单一维度的向量,以及一个z不带尾随单一维度的向量,

x = np.zeros((M,N))
y = np.zeros((M,1))
z = np.zeros((M,))
Run Code Online (Sandbox Code Playgroud)

广播操作的行为根据矢量表示和上下文而变化:

x[:,0] = y      # error cannot broadcast from shape (M,1) into shape (M)
x[:,0] = z      # OK

x[:,0] += y     # error non-broadcastable output with shape (M) doesn't match 
                # broadcast shape(M,M)
x[:,0] += z     # OK

x - y           # OK
x - z           # error cannot broadcast from shape (M,N) into shape (M)
Run Code Online (Sandbox Code Playgroud)

我意识到我可以做到以下几点:

x - z[:,None]   # OK
Run Code Online (Sandbox Code Playgroud)

但我不明白这个明确的符号是什么给我买的.它当然不会购买可读性.我不明白为什么表达式没问题 …

python numpy

9
推荐指数
1
解决办法
1895
查看次数

用于非平凡列表推导的惯用Python

在Python中对iterable执行简单转换是通过列表解析来实现的:

y = [f(arg) for arg in args]
Run Code Online (Sandbox Code Playgroud)

where f是一个简单的语句,或者一个函数mapif f是一个命名函数:

y = map(f, args)
Run Code Online (Sandbox Code Playgroud)

圭多有利于列表解析map(lambda x:..., args),确实列表内涵上的使用mapfilter 在所有.

但是,我不清楚我应该如何解决以下问题:

  • 修改可迭代的每个元素,
  • 以非平凡的方式,
  • 使用一个独立的逻辑(可能是一个函数),
  • 这在其他任何地方都没用

解决此类问题最常用的方法是什么?我见过并尝试过的一些我已经参与过的Python项目:

Predeclare和循环

显而易见的方法是预先声明输出和循环:

def transform(...):

    ...

    y = []
    for arg in args:
        first_statement
        second_statement
        ...
        y.append(statement)
Run Code Online (Sandbox Code Playgroud)

评论:

  • (亲)容易遵循逻辑
  • (con)逻辑没有作用域(泄漏抽象)
  • (con)逻辑不明确(你怎么知道它是一个地图而不检查循环中所有分支是如何运作的?)
  • (con)以一种无用的方式不必要地预先声明变量(y必须与长度相同args)

嵌套函数

另一种选择是将逻辑封装在嵌套函数中,然后使用map或list comprehension调用它:

def transform(...):

    ...

    def anonymous(arg):
        first_statement
        second_statement
        ...
        return statement

    y = map(anonymous, …
Run Code Online (Sandbox Code Playgroud)

python idiomatic

6
推荐指数
0
解决办法
340
查看次数

标签 统计

python ×2

idiomatic ×1

numpy ×1