2016-12-04 3 views
1

Я новичок в python. Вот моя проблема.Поиск взаимных элементов между двумя многомерными массивами numpy

import numpy as np 

def neighbors(indexset, i,j): 
    temp = np.array([[i-1,j],[i+1,j],[i,j-1],[i,j+1]]) 
    for ele in temp: 
     if ele in indexset: 
      print(ele) 

indexset = np.array([[0,1],[1,1],[2,1],[3,1]]) 
neighbors(indexset, 0,0) 

Когда я запускаю это я получаю значения я не понимаю

neighbors(indexset, 0,0) 
[1 0] 
[ 0 -1] 
[0 1] 

Что я делаю неправильно? Почему это не возвращает только [0,1]?

+0

Какие два многомерные массивы Numpy в образце? – Divakar

+0

Цель состоит в том, чтобы найти общие элементы temp и indexset – kevinkayaks

ответ

2

Я думаю, что вы получаете стабильные результаты, потому что ele in temp подходит только в том случае, если ele является скаляром. Он использует функцию numpy__contains__, что эквивалентно (a==b).any(). Если вы делаете это с питона списков вместо Numpy массивов, это работает:

def neighbors(indexset, i,j): 
    temp = [[i-1,j],[i+1,j],[i,j-1],[i,j+1]] 
    for ele in temp: 
     if ele in indexset: 
      print(ele) 

indexset = [[0,1],[1,1],[2,1],[3,1]] 
neighbors(indexset, 0,0) 

[0,1] Напечатает, как и ожидалось. Если indexset всегда NumPy массив, вы можете использовать tolist:

import numpy as np 

def neighbors(indexset, i,j): 
    temp = [[i-1,j],[i+1,j],[i,j-1],[i,j+1]] 
    for ele in temp: 
     if ele in indexset.tolist(): 
      print(ele) 

indexset = np.array([[0,1],[1,1],[2,1],[3,1]]) 
neighbors(indexset, 0,0) 
+0

Спасибо! Я вижу, что код работает в списках. Я думаю, что индексный набор должен быть многоуровневым массивом. Предлагаемая версия с листом не работает. Я получаю ValueError: Значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all(). Я думаю, мне нужен другой подход, чем использование 'in' – kevinkayaks

+0

Я получаю тот же результат, что и реализация списка. Вы использовали то, что я написал во второй части моего ответа? Потому что 'temp' также должен быть списком, который есть в моей функции. Возможно, вы оставили 'temp' в виде массива numpy в своей версии подхода tolist? –

+0

Да, я могу реплицировать ваш 'ValueError', сделав' temp' массив numpy в функции 'neighbours' и только используя' tolist' на 'indexset'. Просто измените 'temp = np.array ([[i-1, j], [i + 1, j], [i, j-1], [i, j + 1]])' to temp = [[ i-1, j], [i + 1, j], [i, j-1], [i, j + 1]] 'в вашей версии' neighbours', которая использует 'tolist', и это сработает. –

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