Получите доступ к NumPy со стилем поиска в словаре, но оставайтесь с NUMPY операциями с массивами

45
4

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

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

спросил(а) 2019-02-28T11:47:00+03:00 9 месяцев, 1 неделя назад
2
Решение
70

Я думаю, что вам лучше писать свой класс с нуля, а не расширять 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'?

ответил(а) 2019-02-28T12:03:00+03:00 9 месяцев, 1 неделя назад
Еще 1 ответ
32

Вы хотите переопределить метод __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]

ответил(а) 2019-02-28T11:52:00+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема