小编a_g*_*est的帖子

在`__init_subclass__`中使用`super()`找不到parent的classmethod

我尝试从内部访问父类的类方法,__init_subclass__但似乎不起作用.假设以下示例代码:

class Foo:
    def __init_subclass__(cls):
        print('init', cls, cls.__mro__)
        super(cls).foo()

    @classmethod
    def foo(cls):
        print('foo')


class Bar(Foo):
    pass
Run Code Online (Sandbox Code Playgroud)

这会产生以下异常:

AttributeError: 'super' object has no attribute 'foo'
Run Code Online (Sandbox Code Playgroud)

cls.__mro__然而,这表明它Foo是其中的一部分:(<class '__main__.Bar'>, <class '__main__.Foo'>, <class 'object'>).

所以我不明白为什么super(cls).foo()不派遣Foo.foo.有人可以解释一下吗?

python inheritance class-method python-3.6

8
推荐指数
1
解决办法
318
查看次数

根据从极坐标到笛卡尔坐标的变换重新排列二维数组中的数据

我有一个二维数组,表示极坐标系中位置处的函数值。例如:

import numpy as np

radius = np.linspace(0, 1, 50)
angle = np.linspace(0, 2*np.pi, radius.size)
r_grid, a_grid = np.meshgrid(radius, angle)
data = np.sqrt((r_grid/radius.max())**2
               + (a_grid/angle.max())**2)
Run Code Online (Sandbox Code Playgroud)

这里的data排列在与极坐标相对应的矩形网格中。我想重新排列数组中的数据,使轴代表相应的笛卡尔坐标系。旧版与新版布局的可视化如下:

import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=plt.figaspect(0.5))
ax1.set(title='Polar coordinates', xlabel='Radius', ylabel='Angle')
ax1.pcolormesh(r_grid, a_grid, data)
ax2.set(title='Cartesian coordinates', xlabel='X', ylabel='Y')
x_grid = r_grid * np.cos(a_grid)
y_grid = r_grid * np.sin(a_grid)
ax2.pcolormesh(x_grid, y_grid, data)
Run Code Online (Sandbox Code Playgroud)

例子

这里明确给出了坐标,并相应地调整了绘图。我希望将数据重新排列在数据数组本身中。它应该包含所有值,可以选择填充零以适应形状(类似于scipy.ndimage.rotate(..., reshape=True))。

如果我手动遍历极坐标数组来计算笛卡尔坐标,结果包含理想情况下也应该填充的空白区域:

new = np.zeros_like(data)
visits = np.zeros_like(new)
for r, a, d in np.nditer((r_grid, a_grid, …
Run Code Online (Sandbox Code Playgroud)

python numpy scipy coordinate-transformation polar-coordinates

8
推荐指数
1
解决办法
1107
查看次数

当涉及无穷大值时,熊猫滚动返回 NaN

rolling包含inf值的系列上使用时,NaN即使操作定义明确,结果也会包含,例如minmax。例如:

import numpy as np
import pandas as pd

s = pd.Series([1, 2, 3, np.inf, 5, 6])
print(s.rolling(window=3).min())
Run Code Online (Sandbox Code Playgroud)

这给出:

0    NaN
1    NaN
2    1.0
3    NaN
4    NaN
5    NaN
dtype: float64
Run Code Online (Sandbox Code Playgroud)

虽然我期待

0    NaN
1    NaN
2    1.0
3    2.0
4    3.0
5    5.0
Run Code Online (Sandbox Code Playgroud)

计算系列的最小值直接按预期工作:

s.min()  # 1.0
Run Code Online (Sandbox Code Playgroud)

NaN引入附加值的原因是什么?


Python 3.8.1,熊猫 1.0.2

python python-3.x pandas

8
推荐指数
1
解决办法
298
查看次数

为什么禁止覆盖日志记录属性?

阅读 Pythonlogging库的文档(对于 2.7 版)我遇到了以下内容:

Logger.debug(msg, *args, **kwargs)

[...] 第二个关键字参数是额外的,可用于传递字典,该字典用于填充__dict__为具有用户定义属性的日志事件创建的 LogRecord。然后可以根据需要使用这些自定义属性。例如,它们可以合并到记录的消息中。[...]额外传入的字典中的键不应与日志系统使用的键发生冲突。[嗯。矿]

那么为什么会存在这个约束呢?在我看来,这无缘无故地从库中删除了灵活性(由开发人员检查哪些键是内置的,哪些不是)。

想象一下,你想写一个装饰器来记录函数的进入和退出:

def log_entry_exit(func):
    def wrapper(*args, **kwargs):
        logger.debug('Entry')
        result = func(*args, **kwargs)
        logger.debug('Exit')
        return result
    return wrapper

@log_entry_exit
def foo():
    pass
Run Code Online (Sandbox Code Playgroud)

假设您还想记录封闭函数的名称:

format_string = '%(funcName)s: %(message)s'
Run Code Online (Sandbox Code Playgroud)

哎呀!这不起作用。输出是:

>>> foo()
wrapper: Entry
wrapper: Exit
Run Code Online (Sandbox Code Playgroud)

当然,函数名称的计算结果为 ,wrapper因为那是封闭函数。然而这不是我想要的。我想打印装饰函数的函数名称。因此,只需将我的日志记录调用修改为:

logger.debug('<msg>', extra={'funcName': func.__name__})
Run Code Online (Sandbox Code Playgroud)

但是(正如文档已经指出的那样)这不起作用:

KeyError: "Attempt to overwrite 'funcName' in LogRecord"
Run Code Online (Sandbox Code Playgroud)

尽管如此,对于给定的问题,这将是一个非常简单和轻松的解决方案。

再说一次,为什么logging阻止我为内置属性设置自定义值?

python logging

7
推荐指数
1
解决办法
1987
查看次数

python:组合位置和可选参数时argparse抛出值错误

我正在尝试在python中使用argparse库来读取可选和必需的参数.到目前为止我这样做:

import argparse
parser = argparse.ArgumentParser(description='Cleanup Script for Folder')

parser.add_argument('PATH_TO_WORKDIR_ROOT', type=str, dest='PATH_TO_WORKDIR_ROOT', action='store', help='(absolute or) relative path to directory \n   to work on, e.g. "..\MyFolder\\"')
parser.add_argument('--PATH_TO_BACKUP_ROOT', type=str, dest='PATH_TO_BACKUP_ROOT', action='store', help='(absolute or) relative path to Backup-Directory \n   default is ".\BACKUP\"')

args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

现在我正在测试我的代码,它给了我一个我不理解的值错误:

$ python argparsetest.py --help
Traceback (most recent call last):  
File "argparsetest.py", line 5, in <module>
    parser.add_argument('PATH_TO_WORKDIR_ROOT', type=str, dest='PATH_TO_WORKDIR_ ROOT', action='store', help='(absolute or)
relative path to directory \n   to wo rk on, e.g. "..\MyFolder\\"')  
File "C:\Program
Files\Enthought\Canopy\App\appdata\canopy-1.3.0.1715.win-x86_
64\lib\argparse.py", …
Run Code Online (Sandbox Code Playgroud)

exception python-2.7 argparse

7
推荐指数
1
解决办法
2891
查看次数

为什么float .__ repr__返回与等效格式选项相比不同的表示形式?

为了查看repr(x)CPython中float的工作方式,我检查了以下代码float_repr

buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
                            'r', 0,
                            Py_DTSF_ADD_DOT_0,
                            NULL);
Run Code Online (Sandbox Code Playgroud)

这会调用PyOS_double_to_string格式代码'r',该格式代码似乎已转换为'g'精度设置为17的格式代码:

precision = 17;
format_code = 'g';
Run Code Online (Sandbox Code Playgroud)

因此,我希望repr(x)f'{x:.17g}'返回相同的表示形式。但是,情况似乎并非如此:

>>> repr(1.1)
'1.1'
>>> f'{1.1:.17g}'
'1.1000000000000001'
>>> 
>>> repr(1.225)
'1.225'
>>> f'{1.225:.17g}'
'1.2250000000000001'
Run Code Online (Sandbox Code Playgroud)

我知道,repr仅需要返回与重构内存中所表示的相同对象相同数量的数字,因此'1.1'显然足以取回该数字,1.1但我想知道这与(内部使用)与(内部使用)有何不同(或为什么) ).17g格式选项。

(Python 3.7.3)

python floating-point cpython python-3.x

7
推荐指数
1
解决办法
99
查看次数

在 Tensorflow 2.0 中通过前辈增加张量的每个元素

我是tensorflow 2.0 的新手,除了从样板代码设计和训练一些人工神经网络之外,并没有做太多事情。我正在尝试为新人解决新 tensorflow 的练习。我创建了一些代码,但它不起作用。以下是问题定义


假设我们有M形状为 的有理数张量(a, b, c)和标量p ? (0, 1)(记忆因子),让我们创建一个函数,该函数将返回N形状为 的张量(a, b, c)N沿c轴移动的张量的每个元素都应增加前身乘以 的值p

假设我们有张量:

T = [x1, x2, x3, x4]
Run Code Online (Sandbox Code Playgroud)

在 的形状中(1, 1, 4),我们想得到向量:

[x1, x2+x1·p, x3+(x2+x1·p)·p, x4+(x3+(x2+x1·p)·p)*p] 
Run Code Online (Sandbox Code Playgroud)

解决方案应该在Tensorflow 2.0 中创建,并且应该专注于在 CPU 上提供最短的执行时间。创建的图形应该允许有效地计算 tensorM和 value 的导数p


这是我创建到现在代码

import tensorflow as tf

@tf.function
def …
Run Code Online (Sandbox Code Playgroud)

python tensorflow tensor tensorflow2.0

7
推荐指数
1
解决办法
282
查看次数

除了子句中的断点无权访问绑定异常

考虑以下示例:

try:
    raise ValueError('test')
except ValueError as err:
    breakpoint()  # at this point in the debugger, name 'err' is not defined
Run Code Online (Sandbox Code Playgroud)

在这里,进入断点后,调试器无权访问绑定到的异常实例err

$ python test.py 
--Return--
> test.py(4)<module>()->None
-> breakpoint()
(Pdb) p err
*** NameError: name 'err' is not defined
Run Code Online (Sandbox Code Playgroud)

为什么会这样?如何访问异常实例?目前我正在使用以下解决方法,但感觉很尴尬:

$ python test.py 
--Return--
> test.py(4)<module>()->None
-> breakpoint()
(Pdb) p err
*** NameError: name 'err' is not defined
Run Code Online (Sandbox Code Playgroud)

有趣的是,使用此版本,我还可以err在调试器中向上移动一帧时访问绑定异常:

$ python test.py 
--Return--
> test.py(5)_tmp()->None
-> breakpoint()
(Pdb) up
> test.py(6)<module>()
-> _tmp() …
Run Code Online (Sandbox Code Playgroud)

python breakpoints exception python-3.x pdb

7
推荐指数
1
解决办法
369
查看次数

如何为最小二乘优化确定适当的 ftol、xtol 和 gtol 值?

我正在使用least_squares优化来根据某些测量数据调整数值模型的输出。在这个阶段,我想知道如何确定ftolxtolgtol参数的适当值,因为它们确定优化将如何以及在何处停止。对我来说,这些参数似乎非常适合算法的框架,但我发现很难将它们与现实世界的属性联系起来。

例如,我对测量数据有不确定性估计,因此一旦优化器在不确定性限制内模型的输出和测量数据之间达到足够的一致性,就可以合理地停止(即 )np.all(np.abs(model_output - measured_data) < uncertainty)。然而这似乎不能用ftol参数来表达。终止条件为dF < ftol * F(其中F是残差平方和,dF是其变化),因此,即使我可以计算ftol以防止更新小于一旦F达到该级别的不确定性,我也可能会在远离预期的地方提前终止。所需的解决方案。最后,由优化器决定在每次迭代时要采取多大的步长(从而确定dF),因此与所需的解决方案相去甚远,因此dF可能会很小。F

另一方面是参数值的改变。最后,优化得到的结果将用于调整一些实际设备,而这些设备的精度是有限的。例如,设备不会区分相差小于 的值1e-6。这再次意味着,一旦模型的输出和测量数据之间达到足够的一致性,任何小于的参数更新1e-6都是没有意义的。另一方面,许多小的更新< 1e-6可以总结为更大的整体更新> 1e-6,我又回到了同样的问题:这取决于优化器想要采取多大的步骤并限制这一点,我担心我会冒过早的风险终止。此外,该xtol参数再次仅描述参数更新和当前值之间的比例因子。虽然我可以使用一些值来反映设备在预期最终参数值周围的精度,但我已经看到优化器达到的中间参数值比最终估计值大两个数量级,因此这显然有提前终止的风险。

虽然我发现很难为ftolxtolgtol参数选择合适的值,但在没有良好论证的情况下将它们保留为默认值同样令人不满意,因为这意味着同意它们的默认值是合理的。

python optimization scipy scipy-optimize

7
推荐指数
1
解决办法
1649
查看次数

如何在“DataFrame.to_json”期间获得浮点数的精确表示?

我观察到以下行为DataFrame.to_json

>>> df = pd.DataFrame([[eval(f'1.12345e-{i}') for i in range(8, 20)]])
>>> df
             0             1             2             3             4             5             6             7             8             9             10            11
0  1.123450e-08  1.123450e-09  1.123450e-10  1.123450e-11  1.123450e-12  1.123450e-13  1.123450e-14  1.123450e-15  1.123450e-16  1.123450e-17  1.123450e-18  1.123450e-19
>>> print(df.to_json(indent=2, orient='index'))
{
  "0":{
    "0":0.0000000112,
    "1":0.0000000011,
    "2":0.0000000001,
    "3":0.0,
    "4":0.0,
    "5":0.0,
    "6":0.0,
    "7":0.0,
    "8":1.12345e-16,
    "9":1.12345e-17,
    "10":1.12345e-18,
    "11":1.12345e-19
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,所有数字似乎1e-16都四舍五入到小数点后 10 位(与 的默认值一致double_precision),但所有较小的值都被精确表示。为什么会出现这种情况?如何关闭较大值的小数舍入(即改用科学记数法)?


>>> pd.__version__
'1.3.1'
Run Code Online (Sandbox Code Playgroud)

作为参考,标准库的json模块不会这样做:

>>> import json
>>> print(json.dumps([eval(f'1.12345e-{i}') for i …
Run Code Online (Sandbox Code Playgroud)

python floating-point json pandas

7
推荐指数
1
解决办法
1522
查看次数