Получите доступ к 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
Может кто-нибудь помочь мне решить это? Спасибо и добрые пожелания
Я думаю, что вам лучше писать свой класс с нуля, а не расширять numpy.ndarray
Мои причины:
Поскольку вы будете работать с нечисловыми индексами, вы, вероятно, собираетесь ограничить себя одномерными структурами. Это означает, что вы будете полностью игнорировать все многомерные возможностиnumpy.ndarray
s. numpy.ndarray
поставляется с некоторыми ограничениями, такими как тот факт, что все элементы должны иметь одинаковый размер в байтах. Эти ограничения могут вас не устраивать.
Кроме того, вы, возможно, захотите взглянуть на структурированные массивы numpy, так как они также могут индексироваться нечисловыми индексами (ну, в определенном ограниченном смысле, на самом деле - пожалуйста, ознакомьтесь с приведенными там примерами).
Просто любопытно, какая y
вас желаемая функциональность и семантика: если 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
имеют одинаковую длину 3. Но data_1 == data_2
ли вы data_1 == data_2
сравнивать их с data_1 == data_2
? Как насчет массива логических значений, полученных в результате сравнения? Вы бы проиндексировали логический массив с помощью 'red'
, 'green'
и 'blue'
или с 'high'
, 'medium'
, 'low'
?
Вы хотите переопределить метод __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]