Уже есть несколько отличных ответов на вашу проблему.Вот только быстрое и грязное решение для вашего конкретного кода:
for i in indices:
print(currentGrid[i[0],i[1]])
Редактировать:
Если вы не хотите использовать цикл for, вам нужно сделать следующее:
Предположим, у вас есть 3 значения вашей 2D-матрицы (с размерами x1
и x2
, к которым вы хотите получить доступ. Значения имеют «координаты» (индексы) V1(x11|x21), V2(x12|x22), V3(x13|x23)
. Затем для каждогоизмерение вашей матрицы (2 в вашем случае) вам нужно создать список с индексами для этого измерения ваших точек.В этом примере вы создадите один список с индексами x1
: [x11,x12,x13]
и один список сx2
индексы ваших очков: [x21,x22,x23]
. Затем вы объединяете эти списки и используете их в качестве индекса для матрицы:
indices = [[x11,x12,x13],[x21,x22,x23]]
или как вы пишете:
indices = list([(x11,x12,x13),(x21,x22,x23)])
Теперь с точками, которые вы использовали ((0,0),(1,1),(2,0))
- обратите внимание, что вам нужно использовать (2,0) вместо (0,2), потому что в противном случае это было бы вне диапазона:
indices = list([(0,1,2),(0,1,0)])
print(currentGrid[indices])
Это будетдать вам 0, 0.9, 0.1
. И в этом списке вы можете затем применить команду max (), если хотите (просторассмотрите весь свой вопрос):
maxValue = max(currentGrid[indices])
Edit2:
Вот пример того, как вы можете преобразовать свой исходный индексный список, чтобы получить его правильную форму:
originalIndices = [(0,0),(1,1),(2,0)]
x1 = []
x2 = []
for i in originalIndices:
x1.append(i[0])
x2.append(i[1])
newIndices = [x1,x2]
print(currentGrid[newIndices])
Edit3:
Я не знаю, можно ли применить max(x,0.5)
к массиву с использованием цикла.Но вы могли бы использовать Панды вместо этого.Вы можете преобразовать свой список в серию панд, а затем применить лямбда-функцию:
import pandas as pd
maxValues = pd.Series(currentGrid[newIndices]).apply(lambda x: max(x,0.5))
. Это даст вам массив панд, содержащий 0.5,0.9,0.5
, который вы можете просто привести обратно к списку maxValues = list(maxValues)
.
Только одно примечание: в фоновом режиме у вас всегда будет работать какой-то цикл, также с этой командой.Я сомневаюсь, что вы получите намного лучшую производительность от этого.Если вы действительно хотите повысить производительность, используйте цикл for вместе с numba (вам просто нужно добавить декоратор к вашей функции) и выполняйте его параллельно.Или вы можете использовать библиотеку multiprocessing
и функцию Pool
, см. здесь .Просто чтобы дать вам вдохновение.
Edit4:
Случайно я увидел эту страницу сегодня, которая позволяет делать именно то, что вы хотите с Numpy
.Решение (рассмотрите вектор newIndices
из моего Edit2) вашей проблемы:
maxfunction = numpy.vectorize(lambda i: max(i,0.5))
print(maxfunction(currentGrid[newIndices]))