Модификация массива с масками - PullRequest
1 голос
/ 21 февраля 2010

В настоящее время у меня есть код, который проверяет, равен ли данный элемент в массиве = 0, и если это так, тогда установите значение в значение 'level' (temp_board - это двумерный массив с нулевыми значениями, indices_to_watch содержит 2D-координаты, которые должны отслеживаться для нулей).

    indices_to_watch = [(0,1), (1,2)]
    for index in indices_to_watch:
        if temp_board[index] == 0:
            temp_board[index] = level

Я хотел бы преобразовать это в более похожий на ноль подход (удалите for и используйте только ноль-функции), чтобы ускорить это. Вот что я попробовал:

    masked = np.ma.array(temp_board, mask=(a!=0), hard_mask=True)
    masked.put(indices_to_watch, level)

Но, к сожалению, маскированный массив при выполнении put () хочет иметь одномерные измерения (совершенно странно!), Есть ли другой способ обновления элементов массива, равных 0 и имеющих конкретные индексы?

Или, может быть, использование замаскированных массивов - это не тот путь?

Ответы [ 3 ]

1 голос
/ 21 февраля 2010

Я не уверен, что следую всем деталям в вашем вопросе. Если я правильно понял, то кажется, что это простая индексация Numpy. Приведенный ниже код проверяет массив (A) на наличие нулей, и там, где он их находит, он заменяет их на «level».

import numpy as NP
A = NP.random.randint(0, 10, 20).reshape(5, 4) 
level = 999
ndx = A==0
A[ndx] = level
1 голос
/ 23 февраля 2010

Если предположить, что temp_board не очень неэффективно, 0, вы можете сделать то, что вы хотите, так:

# First figure out where the array is zero
zindex = numpy.where(temp_board == 0)
# Make a set of tuples out of it
zindex = set(zip(*zindex))
# Make a set of tuples from indices_to_watch too
indices_to_watch = set([(0,1), (1,2)])
# Find the intersection.  These are the indices that need to be set
indices_to_set = indices_to_watch & zindex
# Set the value
temp_board[zip(*indices_to_set)] = level

Если вы не можете сделать выше, вот способ, но я не уверен, что это самый Pythonic:

indices_to_watch = [(0,1), (1,2)]

Сначала преобразуйте в массив numpy:

indices_to_watch = numpy.array(indices_to_watch)

Затем сделайте его индексируемым:

index = zip(*indices_to_watch)

Затем проверьте условие:

indices_to_set = numpy.where(temp_board[index] == 0)

Затем выясните фактические индексы для установки:

final_index = zip(*indices_to_watch[indices_to_set])

Наконец, установите значения:

temp_board[final_index] = level
0 голосов
/ 21 февраля 2010

Вы должны попробовать что-то в этом роде:

temp_board[temp_board[field_list] == 0] = level
...