Нарезка области 20 × 20 вокруг известных индексов (x, y) в массиве NumPy - PullRequest
3 голосов
/ 09 ноября 2011

У меня есть большой двумерный массив, для которого я знаю пару индексов, которые представляют один элемент массива. Я хочу установить этот элемент и окружающую область 20 × 20 равными нулю; Я пытался использовать технику нарезки:

s = array[x:10, y:10]
s == 0

Однако, хотя x и y определены ранее, это «недопустимый срез».

Буду признателен за любые предложения относительно того, как мне это сделать, поскольку я новичок в Python.

Ответы [ 4 ]

3 голосов
/ 09 ноября 2011
my_array[x - 10:x + 10, y - 10:y + 10] = 0

или

s = my_array[x - 10:x + 10, y - 10:y + 10]
s[:] = 0
0 голосов
/ 09 ноября 2011

Обратите внимание, что для того, чтобы блок нулей центрировался по вашим координатам x, y, он должен быть нечетного размера. Например, блок нулей в следующем не центрируется по координатам x, y = 4,6, а по центральным координатам этой ячейки, то есть x, y = 4.5, 5.5:

import numpy

a = numpy.ones((10,10))
x,y = 4,6
s = 2
a[x - s: x + s, y-s: y + s] = 0

array([[ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.]])

тогда как этот:

a = numpy.ones((10,10))
x,y = 4,6
s = 2
a[x - s: x + s + 1, y-s: y + s + 1] = 0
print a

array([[ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.,  0.,  1.],
       [ 1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.,  0.,  1.],
       [ 1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.,  0.,  1.],
       [ 1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.,  0.,  1.],
       [ 1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.,  0.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.]])

Если скрипт предназначен для обработки изображений на основе пикселей, это может быть важным отличием.

0 голосов
/ 09 ноября 2011

Вы выбираете несколько элементов массива A с помощью A[start:stop], где start и stop являются индексами, начинающимися с нуля.
Для 2D-массива это также применимо: A[start1:stop1, start2:stop2].

С помощью следующего скрипта

import numpy as np

A = np.ones((5,5))

A выглядит следующим образом

[[ 1.  1.  1.  1.  1.]
 [ 1.  1.  1.  1.  1.]
 [ 1.  1.  1.  1.  1.]
 [ 1.  1.  1.  1.  1.]
 [ 1.  1.  1.  1.  1.]]

с

A[1:4,1:4] = 0

вы получаете

[[ 1.  1.  1.  1.  1.]
 [ 1.  0.  0.  0.  1.]
 [ 1.  0.  0.  0.  1.]
 [ 1.  0.  0.  0.  1.]
 [ 1.  1.  1.  1.  1.]]
0 голосов
/ 09 ноября 2011

Я полагаю, вы имеете в виду array[x:x+10,y:y+10]

...