以下内容未提出:
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)
这是一个已知的问题吗?我该怎么办才能修复它?我需要从看起来完全像列表的东西继承并创建一个抽象的继承者.谢谢.
我目前正在尝试处理具有缺失值的实验时间序列数据集.我想计算该数据集随时间的滑动窗口平均值,同时处理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) 我创建了一个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) 我有以下代码片段:
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)
为什么会这样?
我想制作一个实时应用程序,它涉及查找二进制掩码的边缘.如果可能的话,我需要一些快速的东西,没有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)
那么,有没有人可以进一步了解如何加速我的算法?我强调我希望这个算法用于二进制图像,所以我想必须有一个更好的实现.
跑步:
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 转换为 …