在Python对象和numpy数组之间传输数据?

时间:2018-02-02 06:25:12

标签: python numpy

我正在使用图片,我正在处理我写过的课程Pixel(x, y)的对象列表。我经常要执行这样的操作 -

std_dev = np.array(map(lambda x: x.std_dev, pixels))
# numpy processing on std_dev ---> new_property
for i, p in enumerate(pixels):
    p.new_property = new_property[i]

"移动"最有效的方法是什么? Python对象和numpy之间的数据?我想保留Pixel类,因为我需要它来对图像的某些部分进行更精细的处理。

更新#1
是的,pixelsPixel个对象的列表。我想在图像的标准偏差图上应用高斯平滑。图像中的每个图像像素都具有与之关联的标准偏差值。我对上述问题的一般解决方案更感兴趣,而不是我的高斯卷积的具体情况。

1 个答案:

答案 0 :(得分:0)

您可以让所有像素知道他们的索引,并将ndarrays的相同词典作为property-> values map共享。然后使用字典键访问Pixel的属性和Pixel的索引以访问该属性数组中的位置。这样你的像素变成了指向这些数组的指针。但是,您必须将字典保留在中心位置。为方便起见,我会创建一个主人或工厂类 像这样:

class Pixel(object):
    def __init__(self, x, y, properties):
        # _properties has to be assigned first!
        self._properties = properties
        self._x = x
        self._y = y

    def __getattribute__(self, attr):
        try:
            return super().__getattribute__(attr)
        except AttributeError:
            return self._properties[attr][self._x, self._y]

    def __setattr__(self, attr, value):
        if attr != '_properties' and attr in self._properties:
            self._properties[attr][self._x, self._y] = value
        else:
            super().__setattr__(attr, value)

class Pixelmaster(object):

    def __init__(self, width, height):
        self.properties = dict()
        self.pixels = np.array([[Pixel(x, y, self.properties) for y in range(height)] for x in range(width)])

    def setProperty(self, prop, value):
        if value.shape != self.pixels.shape:
            raise ValueError('Value has wrong shape %s, should have %s!' % (value.shape, self.pixels.shape))
        self.properties[prop] = value
        return value

    def newProperty(self, prop, dtype=float):
        return self.setProperty(prop, np.empty_like(self.pixels, dtype=dtype))

    def getProperty(self, prop):
        return self.properties[prop]

有了这个,你可以做类似的事情:

master = Pixelmaster(100,100)
# get pixel at position 0, 0
p = master.pixels[0, 0]

# create a new property
master.setProperty('std',np.random.rand(100,100))

print(p.std)

# reassign the pixel's value
p.std = 5

# value is updated at the master...
print(master.properties['std'][0,0])

# ...as well as the pixel itself
print(p.std)

输出:

0.6587814533631399
5.0
5.0

我想你知道从哪里开始。