使用字典查找样式访问Numpy,但保持Numpy数组操作



我想构造一个从numpy.ndarray继承的类,以便它可以作为numpy阵列( , - , - , *,/,...)进行正常操作。我唯一要更改的是我们访问数据中项目的方式。例如:

import numpy as np
from PIL import Image
class Data(np.ndarray):
    """
    Something magical here 
    """
img = np.asarray(Image.open('lena.jpg'))
data = img.view(Data)
data['Red'] #equivalent to img[:,:,0]
normalized_data = data/255. #normalize the data 

有人可以帮我解决这个问题吗?谢谢和善意

您将要覆盖__getItem__方法。这是另一个可能提供一些直觉的问题:了解__getItem__方法。

链接到文档:https://docs.python.org/3/reference/datamodel.html#object.__getitem__

如果您想更改自己的设置值,则覆盖__setitem __

一个例子:

def __getitem__(self, key):
    """ Controls how values are 'gotten'. """
    if key == 'red':
        return self.data[:,:,0]

我认为您最好从头开始写班,而不是扩展numpy.ndarray

我的原因:

  1. 由于您将使用非数字索引,因此您可能会将自己限制为一维结构。这意味着您将完全忽略numpy.ndarrays。
  2. 的所有多维功能
  3. numpy.ndarray具有一些限制,例如元素必须全部均匀的字节大小。这些限制可能不适合您。

另外,您可能需要查看Numpy的结构化阵列,因为它们也可以用非数字索引索引(实际上,在某些有限的意义上 - 请浏览其中给出的示例)。

只是对您的所需功能和语义:在Numpy中,如果xy是两个相同长度的1D Numpy阵列,则允许您将它们与x == y进行比较。另一方面,如果data_1data_2中的两个数组,具有相同的3长度,则它们的索引可能仍然不同。data_1可能用索引值'red''green''blue'索引,而data_2可能用值'high''medium''low'索引。在这两种情况下,有效索引的数量均为3,因此,从某种意义上说,data_1data_2的长度相同。但是,您是否认为将它们与data_1 == data_2进行比较是有效的吗?由比较产生的一系列布尔人呢?您是否可以将布尔数组与'red''green''blue''high''medium''low'

最新更新