python - 使用分配值的用户定义方法创建一个 numpy 数组
问题描述
我需要创建一个空的 numpy 数组(在创建时形状未知),并且能够使用特定的方法(名为“上传”和“下载”)来更新其值并检索它们。
更多上下文:opencv 有一个名为 cuda_GpuMat 的类,当您想在 GPU 上执行计算时,您假设首先创建一个实例,然后使用 upload() 分配您希望处理的 np.array方法,例如:
import numpy as np
import cv2
import cv2.cuda as cvc
x = np.arange(3)
x_gpu = cv2.cuda_GpuMat()
x_gpu.upload(x)
x_gpu = cvc.multiply(x_gpu, x_gpu)
x_gpu.download()
output:
array([[0],
[1],
[4]], dtype=int32)
我想要一个与常规 cpu 兼容的类,因此我可以运行相同的代码(仅更改:将 cv2.cuda 作为 cvc 导入以将 cv2 作为 cvc 导入)。我阅读了有关ndarray 子类化的信息,但无法弄清楚如何正确地做到这一点。
我试过什么?
import cv2
import numpy as np
class CpuMat(np.ndarray):
def __new__(subtype, shape=0, **kwargs):
obj = super(CpuMat, subtype).__new__(subtype, shape, **kwargs)
obj.emptyflag = True
return obj
def __array_finalize__(self, obj):
if obj is None: return
def upload(self, img):
self.img = img
self.emptyflag = False
def download(self):
return self.img
def empty(self):
return self.emptyflag
显然这是行不通的,因为在上面的示例中,cv2 函数对数组本身进行操作,但在我的实现中,数组存储在对象的“img”属性中。我已经尝试了上面的几个版本(例如,我试图定义类的repr()函数来返回self.img,但它必须是一个字符串所以它不起作用),但我是不确定我的解决方案方向是否正确。所以这里的任何帮助都会很棒。
解决方案
推荐阅读
- python - 如何检查集合(functools等)中的特定类是否在C中实现?
- c# - Nuget 是否会自动创建具有 PackageReference 依赖项的包?
- python - Dask 读取 csv 与 pandas 读取 csv
- c# - C# Background Worker 仅在整个处理完成后才报告进度
- java - Android 应用程序在 .click() 命令后关闭
- java - 连接到 HP 质量中心 alm(版本 12.50)
- jquery - 如果输入值更改,如何动态替换 var 中的数据
- mongoose - Mongoose:findOneAndUpdate 返回奇怪的结构
- angular - Angular - 从父路由获取路由参数
- laravel - 在克隆的 Laravel 项目上安装 TYPO3