我想构造一个从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
我的原因:
- 由于您将使用非数字索引,因此您可能会将自己限制为一维结构。这意味着您将完全忽略
numpy.ndarray
s。
的所有多维功能 -
numpy.ndarray
具有一些限制,例如元素必须全部均匀的字节大小。这些限制可能不适合您。
另外,您可能需要查看Numpy的结构化阵列,因为它们也可以用非数字索引索引(实际上,在某些有限的意义上 - 请浏览其中给出的示例)。
只是对您的所需功能和语义:在Numpy中,如果x
和y
是两个相同长度的1D Numpy阵列,则允许您将它们与x == y
进行比较。另一方面,如果data_1
和data_2
是中的两个数组,具有相同的3
长度,则它们的索引可能仍然不同。data_1
可能用索引值'red'
,'green'
和'blue'
索引,而data_2
可能用值'high'
,'medium'
,'low'
索引。在这两种情况下,有效索引的数量均为3
,因此,从某种意义上说,data_1
和data_2
的长度相同。但是,您是否认为将它们与data_1 == data_2
进行比较是有效的吗?由比较产生的一系列布尔人呢?您是否可以将布尔数组与'red'
,'green'
和'blue'
或'high'
,'medium'
,'low'
?