2014-10-21 2 views
1


Сравнение соседей каждого элемента массива с для цикла

Я новый пользователь Python, и я нахожу, что сочетание Python + Numpy + Matplotlib удивительно. Я знаю немного C, и меня попросили использовать Python в работе, все шло хорошо, у Numpy есть эти невероятные функции, которые могут делать почти все, что мне нужно. Но я думаю, что я наступил на свой первый камень, когда попытался использовать «for-loop» с Numpy. Я не знаю, что я делаю неправильно, но я считаю, что моя логика C делает мне совершать некоторые ошибки.

Подведение итогов: У меня есть один большой массив «A» (1D), сделанный из 0 и 1 таким образом, что все 1 вместе. У меня есть другой массив «B» (256x9) с разными условиями. Я хочу запустить через массив A, сравнивая все 8 соседей каждого элемента A с каждым из первых 8 столбцов B и когда он найдет правильный выбор. Он назначит значение столбца 9 третьей матрице C (тот же размер как).

Проблема в том, что я не знаю, как работать с индексом в Python, я взглянул в Интернете и не нашел ничего, что могло бы мне помочь. Я пытаюсь получить доступ к соседям элемента, используя такие вещи, как (i + 1, j), (i-1, j), (i-1, j + 1) ... Я получаю из связанных ошибок ,

Я искал что-то вроде этого:

for i in A: 
    for y in B: 
    if A[i-1,j+1] == B[1,y]: 
     if A[i,j+1] == B[2,y]: 
      if A[i+1,j+1] == B[3,y]: 
      if A[i-1,j] == B[4,y]: 
       if A[i+1,j] == B[5,y]: 
       if A[i-1,j-1] == B[6,y]: 
        if A[i,j-1] == B[7,y]: 
        if A[i+1,j-1] == B[8,y]: 
         C[i] = B[9,y], 

Пожалуйста, кто-то может дать мне несколько советов о том, что я делаю не так?

Спасибо,

Edit:

Чтобы быть более ясным, давайте скажем, что оба массива А и В имеют следующий формат. Независимо от того, будет ли массив A 1D или 2D, потому что я могу его изменить. Каждая строка массива B представляет собой соседнее условие, а девятый столбец - это значение, которое должно быть присвоено массиву C, если выполняется условие в этой строке.

A = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0   B = 1 1 1 1 1 1 1 1 0 
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0    1 1 1 1 1 1 1 0 1 
    0 0 0 0 0 0 0 0 0 1 0 0 0 0 0    1 1 1 1 1 1 0 1 1 
    0 0 0 0 1 1 0 0 1 1 0 0 0 0 0    . 
    0 0 0 1 1 1 1 1 1 1 1 1 1 0 0    . 
    0 0 1 1 1 1 1 1 1 1 1 1 1 0 0    . 
    0 0 1 1 1 1 1 1 1 1 1 1 1 0 0    1 1 0 0 0 0 0 0 1 
    0 0 1 1 1 1 1 1 1 1 1 1 1 0 0    1 0 0 0 0 0 0 0 1 
    0 0 1 1 1 1 1 1 1 1 1 1 1 0 0    0 0 0 0 0 0 0 0 0 
    0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 
    0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 
    0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 
    0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

В частности, я пытаюсь найти периметр формы из 1 `ы.

+0

Я думаю, что я мог бы помочь вам немного лучше, если бы вы отправили большую часть своего кода. Как правило, вам не понадобятся петли при использовании numpy. Он имеет множество функций, которые помогут вам избежать циклов, потому что они медленны. Большинство функций numpy фактически выпадают на C для выполнения задач с интенсивным использованием процессора. – Vorticity

+0

Вы говорите, что A - 1D, но вы используете 2D-индексирование. (Я полагаю, что это действительно 2D, поскольку это имеет смысл с 8 соседями.) Кроме того, вы не итерируете по индексам, а элементы в своих массивах. Вы можете взглянуть на http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndindex.html Кроме того, Python основан на 0. Это означает, что вы, вероятно, хотите вычесть один из индексов от 1 до 9 при доступе к B. Кроме того, индекс строк сначала идет на Python, поэтому вам, вероятно, придется поменять вам индексы B. – jgosmann

+0

@MiTz, так как вы определили, что ваша матрица 'A' ​​мне не кажется, это« массив 1D ». Можете ли вы разместить пример массивов 'A' и' B'? Из вашего объяснения и вашей попытки кодировать то, что вы пытаетесь сделать, неясно. – Dalek

ответ

0

for внутри Python делает работу немного по-другому пути, чем в С. Запуск (даже в скорлупе) некоторые простые примеры могут помочь вам немного

collection = ["cat", "dog", "horse"] 

for animal in colection: 
    print animal 

Как вы можете видеть, for присваивает переменной animal элементов список, не их индексы. Поэтому в вашем примере переменной i присваивается 0 или 1, в зависимости от того, какое значение имеет данный элемент в списке.

Но все-таки иногда вы хотели бы работать на индексах (как в вашем случае), так что давайте немного изменить наш пример

collection = ["cat", "dog", "horse"] 

for i in range(len(colection)): 
    print "index: " + i 
    print animal[i] 

На этот раз мы также работать на элементах списка, только список, если мало бит другой. С function range мы создаем список целых чисел от 0 до длины нашего collection. Другими словами, мы создаем новый список с индексами. С ними мы можем получить доступ к элементам в нашей оригинальной.

С помощью команды range вы должны быть в состоянии двигаться вперёд со всей проблемой.

Смежные вопросы