Получите доступ к NumPy со стилем поиска в словаре, но оставайтесь с NUMPY операциями с массивами - PullRequest
0 голосов
/ 28 февраля 2019

Я хочу создать класс, унаследованный от 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 

Может кто-нибудь помочь мне решить эту проблему?Спасибо и всего наилучшего

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Я думаю, что вам лучше написать свой класс с нуля, а не расширять numpy.ndarray

Мои причины:

  1. Поскольку вы будете работать с нечисловымииндексы, вы, вероятно, собираетесь ограничить себя одномерными структурами.Это означает, что вы будете полностью игнорировать все многомерные возможности numpy.ndarray s.
  2. 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 имеют одинаковую длину 3. Но тогда вы сочтете целесообразным сравнить их с * 1039?*?Как насчет массива логических значений, полученных в результате сравнения?Вы бы проиндексировали логический массив с 'red', 'green' и 'blue' или с 'high', 'medium', 'low'?

0 голосов
/ 28 февраля 2019

Вы хотите переопределить метод __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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...