Хобрук: Ваш путь к мастерству в программировании

Манипулирование индексами с массивом 2d numpy

Я могу проиндексировать массив 2d numpy с помощью кортежа или даже списка кортежей.

a = numpy.array([[1,2],[3,4]])
i = [(0,1),(1,0)] # edit: bad example, should have taken [(0,1),(0,1)]
print a[i[0]], a[i]

(Дает 2 [2 3])

Однако я не могу манипулировать кортежами с помощью векторной арифметики, т.е.

k = i[0]+i[1]

не дает желаемого (1,1), но объединяет.

С другой стороны, используя массивы numpy для индексов, арифметика работает, но индексация не работает.

i = numpy.array(i)
k = i[0]+i[1]      # ok
print a[k]

дает массив [[3 4], [3 4]] вместо желаемого 4.

Есть ли способ выполнять векторные арифметические операции над индексами, а также иметь возможность проиндексировать с ними массив numpy (без вывода класса из кортежа и перегрузки всех операторов)?

Этот вопрос сначала выглядел многообещающе, но я не мог понять если я могу применить это к моей ситуации.

Изменить (комментарий к принятому ответу):

... и работа с массивами индексов также работает с использованием карты

arr = numpy.array([[1,2,3],[4,5,6],[7,8,9]])
ids = numpy.array([(0,1),(1,0)])
ids += (0,1) # shift all indices by 1 column
print arr[map(tuple,ids.T)]

(хотя меня смущает, зачем мне транспонирование. Я бы тоже столкнулся с этой проблемой выше, и мне просто повезло с [(0,1),(0,1)])


Ответы:


1

да. Преобразуйте массив NumPy в кортеж, когда вам нужно индексировать:

a[tuple(k)]

Контрольная работа:

>>> a = numpy.array([[1,2],[3,4]])
>>> i = numpy.array([(0,1),(1,0)])
>>> k = i[0] + i[1]
>>> a[tuple(k)]
4
15.03.2012
  • +1 ах просто, сам должен был до этого додуматься! Это дало бы возможность tuple в моем коде, но я буду использовать его сейчас, и если его станет слишком много tuple, я все равно смогу создать свой собственный класс в конце 15.03.2012

  • 2

    Я считаю, что самый простой способ сделать это — создать подкласс кортежа и переопределить его оператор __add__, чтобы он делал то, что вы хотите. Вот как это сделать: поэлементные операции с кортежами Python, такие как sum

    15.03.2012
  • см. мой вопрос (в скобках перед знаком вопроса). Добавление было просто примером, который мне нужен __add__ __sub__ __mul__ __rmul__ __div__ и каждый для скаляра/вектора и вектора/вектора. Возможно, такой класс станет хорошим расширением для будущей версии Python. 15.03.2012

  • 3

    попробуйте следующее, у меня работает:

    import numpy
    
    def functioncarla(a,b):
        return a+b
    
    a = numpy.array([[1,2],[3,4]])
    i = [(0,1),(1,0)]
    
    #k = i[0]+i[1]
    aux = map(functioncarla, i[0], i[1])
    k = tuple(aux)
    print 'k = ', k
    
    print 'a[k] = ', a[k]
    
    15.03.2012
    Новые материалы

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

    Ториго  — революция в игре Го
    Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

    Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
    Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

    Математика и интуиция - Часть 1
    У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..

    Раскрытие возможностей НЛП: часть речевой маркировки и ее проблемы
    В сфере обработки естественного языка (NLP) маркировка частей речи (POS) выступает в качестве фундаментального метода, позволяющего компьютерам понимать и анализировать человеческий язык на..

    Под поверхностью: раскрытие деталей системы с помощью инструментов Linux CLI
    Чем больше вы изучаете Linux и продвигаетесь вперед, тем больше вам нужно проверять информацию о вашей системе. Эта информация может касаться аппаратного обеспечения, такого как процессор,..