Как правильно сравнивать элементы 3 разных массивов numpy? - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь сравнить элементы по одному индексу из 3 разных массивов.Когда я пытаюсь if arr1[i] == arr2[i], я получаю The truth value of an array with more than one element is ambiguous. Use a.any() or a.all().Вот целая функция:

def tmr(arr1, arr2, arr3):
arr4 = arr1
for i in range(arr4.size):
    if arr1[i] == arr2[i]:
        arr4[i] = arr1[i]
    else:
        if arr2[i] == arr3[i]:
            arr4[i] = arr3[i]
return arr4

Я больше знаком с C ++, чем с Python, и я действительно не могу понять, почему это не совсем работает.Я также попытался использовать почтовый индекс, как это:

for w, x, y, z in zip(arr4, arr1, arr2, arr3):
    if x == y == z:
        w = x

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

функции массива numpy np.equal, np.logical_and, np.where - векторизация / трансляция

import numpy as np
arr1 = np.array([0,1,2,3,7])
arr2 = np.array([0,1,0,2,7])
arr3 = np.array([0,0,2,1,7])

arr4 = np.ones(5)*10


eq_idx = np.where(np.logical_and(np.equal(arr1, arr3), np.equal(arr2, arr3)))

arr4[eq_idx] = arr1[eq_idx]

arr4
Out[28]: array([ 0., 10., 10., 10.,  7.])
0 голосов
/ 27 мая 2018

Интерпретируя это как ожидаемый результат в вашем последнем примере, используя zip, попробуйте:

arr4 = arr1[np.equal(arr1, arr2) & np.equal(arr2, arr3)]

Для интерпретации в вашем первом блоке кода вы можете использовать понимание списка:

list4 = [arr1[i] if arr1[i] == arr2[i] else arr3[i] if arr2[i] == arr3[i] else None for i in range(len(arr1))]
arr4 = np.array(list4)

Исходя из вашего примера, я не уверен, что значения по умолчанию для arr4, если ни arr1[i] == arr2[i], ни arr2[i] == arr3[i], поэтому оставили их как None выше.

Два подхода дают разные ответы, но если я правильно интерпретирую, первым является желаемое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...