首页 > 解决方案 > 使用分配值的用户定义方法创建一个 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,但它必须是一个字符串所以它不起作用),但我是不确定我的解决方案方向是否正确。所以这里的任何帮助都会很棒。

标签: pythonnumpyopencv

解决方案


推荐阅读