Производительность NumPy для алгоритмов в отношении отдельных элементов массива

1

Меня интересует производительность NumPy, когда речь заходит об алгоритмах, которые проверяют, является ли условие Истинным для элемента и его принадлежности (например, соседние элементы) и присваивает значение в соответствии с условием.

Примером может быть: (я делаю это сейчас)

  • Я генерирую 2d массив из 1 и 0, случайным образом.
    • Затем я проверяю, совпадает ли первый элемент массива со своими соседями.
    • Если аналогичные - большинство, я переключаю (0 → 1 или 1 → 0) на этот конкретный элемент.
  • И я перехожу к следующему элементу.

Я полагаю, что этот вид элементарных условий и элементарных операций довольно медленный с NumPy, есть ли способ, чтобы я мог улучшить производительность?

Например, создав массив с типом dbool и настроив код, поможет ли он?

Заранее спасибо.

Теги:
numpy

2 ответа

1

Похоже, что вы делаете какую-то обработку изображений, вы можете попробовать scipy.ndimage.

from scipy.ndimage import convolve
import numpy as np
np.random.seed(0)
x = np.random.randint(0,2,(5,5))

print x

w = np.ones((3,3), dtype=np.int8)
w[1,1] = 0
y = convolve(x, w, mode="constant")

print y

выходы:

[[0 1 1 0 1]
 [1 1 1 1 1]
 [1 0 0 1 0]
 [0 0 0 0 1]
 [0 1 1 0 0]]

[[3 4 4 5 2]
 [3 5 5 5 3]
 [2 4 4 4 4]
 [2 3 3 3 1]
 [1 1 1 2 1]]

y - сумма соседей каждого элемента. Сделайте то же свернутое со всеми, вы получите количество соседей по количеству каждого элемента:

>>> n = convolve(np.ones((5,5),np.int8), w, mode="constant")
>>> n
[[3 5 5 5 3]
 [5 8 8 8 5]
 [5 8 8 8 5]
 [5 8 8 8 5]
 [3 5 5 5 3]]

то вы можете выполнять элементарные операции с x, y, n и получать результат.

  • 0
    Да, это ловкий ответ на мое выдуманное дело. Но это был довольно общий вопрос, я не знал, что это можно было бы сделать методом извлечения. Мой вопрос более или менее о произвольном условии и произвольной поэлементной операции.
  • 0
    Это не распространенное решение: если вы хотите выполнить какую-либо операцию, которая может быть рассчитана только поэлементно для цикла for, вы можете создать модуль расширения с помощью cython, SWIG или встроить код c непосредственно в ваш код Python с помощью weave. Но прежде чем делать это, попробуйте сначала методы обработки изображений, такие как сложный, морфологический процесс обработки изображений.
1

Возможно, вам поможет http://www.scipy.org/Cookbook/GameOfLifeStrides.

  • 0
    Это может быть полезно, я проверю Strides, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню