小编Vas*_*dis的帖子

Python 3.7:继承列表,忽略抽象

以下内容未提出:

from abc import ABCMeta, abstractmethod
class Test(list, metaclass=ABCMeta):
    @abstractmethod
    def test(self):
        pass
test = Test()
Run Code Online (Sandbox Code Playgroud)

虽然这样做:

from abc import ABCMeta, abstractmethod
class Test(metaclass=ABCMeta):
    @abstractmethod
    def test(self):
        pass
test = Test()
Run Code Online (Sandbox Code Playgroud)

这是一个已知的问题吗?我该怎么办才能修复它?我需要从看起来完全像列表的东西继承并创建一个抽象的继承者.谢谢.

python list abstract

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

Python:滑动窗口意味着,忽略丢失的数据

我目前正在尝试处理具有缺失值的实验时间序列数据集.我想计算该数据集随时间的滑动窗口平均值,同时处理nan值.我这样做的正确方法是在每个窗口内计算有限元的总和,并将其除以它们的数字.这种非线性迫使我使用非卷积方法来解决这个问题,因此我在这个过程中遇到了严重的时间瓶颈.作为我想要完成的代码示例,我提出以下内容:

import numpy as np
#Construct sample data
n = 50
n_miss = 20
win_size = 3
data= np.random.random(50)
data[np.random.randint(0,n-1, n_miss)] = None

#Compute mean
result = np.zeros(data.size)
for count in range(data.size):
    part_data = data[max(count - (win_size - 1) / 2, 0): min(count + (win_size + 1) / 2, data.size)]
    mask = np.isfinite(part_data)
    if np.sum(mask) != 0:
        result[count] = np.sum(part_data[mask]) / np.sum(mask)
    else:
        result[count] = None
print 'Input:\t',data
print 'Output:\t',result
Run Code Online (Sandbox Code Playgroud)

输出:

Input:  [ 0.47431791  0.17620835  0.78495647  0.79894688  0.58334064  0.38068788
  0.87829696 …
Run Code Online (Sandbox Code Playgroud)

python numpy time-series scipy missing-data

5
推荐指数
2
解决办法
1224
查看次数

烧瓶测试,文件归档和嵌套字典

我创建了一个Flask应用,并想要对其进行测试。在单个端点中,我想发布一个多部分请求,其中包括一个文件和一个复杂的JSON对象。我首先考虑将werkzeug EnvironBuilder用于此任务,因为它似乎提供了一种非常自动化的方法,可以处理内容类型等。准备请求的代码段如下:

# client is an instance of FlaskClient produced using a pytest fixture and the method test client

def _post(endpoint, file_path=None, serialized_message=None):
        with open(file_path, 'rb') as fin:
                fil = io.BytesIO(fin.read())
        file_name = file_path.split(os.sep)[-1]
        builder = EnvironBuilder(path='/' + endpoint,
                                 method='POST',
                                  data=json.loads(
                                      serialized_message),
                                content_type="application/json")
        builder.files[file_name] = fil
        result = client.open(builder, buffered=True)
        return result
Run Code Online (Sandbox Code Playgroud)

失败并显示以下错误:

 def _add_file_from_data(self, key, value):
        """Called in the EnvironBuilder to add files from the data dict."""
        if isinstance(value, tuple):
            self.files.add_file(key, *value)
        elif isinstance(value, dict):
            from warnings import warn …
Run Code Online (Sandbox Code Playgroud)

python multipartform-data flask

5
推荐指数
1
解决办法
538
查看次数

Python 3.5装饰器和函数字段

我有以下代码片段:

def wrapper(func):
    def wrapped(*args, **kwargs):
        func.var = 0
        return func(*args, **kwargs)
    return wrapped

@wrapper
def f_out():
    print(f_out.var)
Run Code Online (Sandbox Code Playgroud)

能告诉我为什么要f_out()加油:

AttributeError: 'function' object has no attribute 'var'
Run Code Online (Sandbox Code Playgroud)

编辑

我不得不详细说明,因为答案给了我另一种选择,但这对我想要的情况不起作用.给出以下代码段:

def wrapper(func):
    def wrapped(*args, **kwargs):
        func.var = 0
        ret = func(*args, **kwargs)
        print(func.var)
    return wrapped

@wrapper
def f_out():
    f_out.var = 1
f_out()
print(f_out.var)
Run Code Online (Sandbox Code Playgroud)

我得到输出:

0
1
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

python field function decorator python-decorators

4
推荐指数
1
解决办法
78
查看次数

在Python中从二进制掩码中检索轮廓掩码的快速方法

我想制作一个实时应用程序,它涉及查找二进制掩码的边缘.如果可能的话,我需要一些快速的东西,没有GPU,每张图像低于0.0005秒,大小(1000,1000).我将使用以下二进制图像示例,大小(1000,1000).

(要复制的代码:)

import numpy as np
im=np.zeros((1000,1000),dtype=np.uint8)
im[400:600,400:600]=255
Run Code Online (Sandbox Code Playgroud)

图片

快速做事的第一个合理方法是使用OpenCV库:

import cv2
timeit.timeit(lambda:cv2.Laplacian(im,cv2.CV_8U),number=100)/100
0.0011617112159729003
Run Code Online (Sandbox Code Playgroud)

正如预期的那样导致: laplacian

我发现这种方式非常耗时.在此之后我尝试了findContours:

 def usingcontours(im):
    points=np.transpose(cv2.findContours(im,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)[1][0])
    tmp=np.zeros_like(im)
    tmp[tuple(points)]=255
    return tmp 
timeit.timeit(lambda:usingcontours(im),number=100)/100
0.0009052801132202148
Run Code Online (Sandbox Code Playgroud)

这给出了与上述相同的结果.这样比较好,但仍然不如我想的那么好.我继续使用numpy,使用渐变近似laplacian,作为最后的手段,虽然我知道它会更糟:

def usinggradient(im):
    tmp=np.gradient(im)
    return ((tmp[0]+tmp[1])>0).astype(np.uint8)
timeit.timeit(lambda:usinggradient(im),number=100)/100
0.018681130409240722
Run Code Online (Sandbox Code Playgroud)

那么,有没有人可以进一步了解如何加速我的算法?我强调我希望这个算法用于二进制图像,所以我想必须有一个更好的实现.

python binary opencv numpy edges

2
推荐指数
1
解决办法
1797
查看次数

TS 视频复制到 MP4,以编程方式读取时丢失 3 个第一帧(ffmpeg 错误)

跑步:

ffmpeg -i test.ts -fflags +genpts -c copy -y test.mp4
Run Code Online (Sandbox Code Playgroud)

对于这个test.ts,它有 30 个帧,可以由 opencv 读取,我最终得到 28 个帧,其中 27 个帧可以由 opencv 读取。进一步来说:

ffprobe -v error -select_streams v:0 -count_packets  -show_entries stream=nb_read_packets -of csv=p=0 tmp.ts 
Run Code Online (Sandbox Code Playgroud)

返回 30。

ffprobe -v error -select_streams v:0 -count_packets     -show_entries stream=nb_read_packets -of csv=p=0 tmp.mp4
Run Code Online (Sandbox Code Playgroud)

返回 28。

以这种方式使用 OpenCV

cap = cv2.VideoCapture(tmp_path)
readMat = []
while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        readMat.append(frame)
Run Code Online (Sandbox Code Playgroud)

我得到 ts 文件 30 帧,而 mp4 得到 27 帧。

有人可以解释为什么存在差异吗?从 ts 转换为 …

python video opencv ffmpeg

2
推荐指数
1
解决办法
148
查看次数