Как проверить, находится ли массив numpy внутри последовательности Python? - PullRequest
0 голосов
/ 30 апреля 2020

Я хотел бы проверить, находится ли данный массив внутри обычной последовательности Python (list, tuple, et c). Например, рассмотрим следующий код:

import numpy as np

xs = np.array([1, 2, 3])
ys = np.array([4, 5, 6])

myseq = (xs, 1, True, ys, 'hello')

Я бы ожидал, что сработает простая проверка членства с помощью in, например:

>>> xs in myseq
True

Но, очевидно, он потерпит неудачу, если элемент I я пытаюсь найти не на первой позиции myseq, например:

>>> ys in myseq
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Так как я могу выполнить эту проверку?

Если возможно, я бы хотел сделать это без необходимости преобразовывать myseq в массив numpy или любую другую структуру данных.

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Вы можете использовать any с соответствующим тестом:

import numpy as np

xs = np.array([1, 2, 3])
ys = np.array([4, 5, 6])
zs = np.array([7, 8, 9])

myseq = (xs, 1, True, ys, 'hello')

def arr_in_seq(arr, seq):
    tp=type(arr)
    return any(isinstance(e, tp) and np.array_equiv(e, arr) for e in seq)

Тестирование:

for x in (xs,ys,zs):
    print(arr_in_seq(x,myseq))
True
True
False
1 голос
/ 30 апреля 2020

Это, вероятно, не самое красивое или быстрое решение, но я думаю, что оно работает:

import numpy as np


def array_in_tuple(array, tpl):
    i = 0
    while i < len(tpl):
        if isinstance(tpl[i], np.ndarray) and np.array_equal(array, tpl[i]):
            return True
        i += 1
    return False


xs = np.array([1, 2, 3])
ys = np.array([4, 5, 6])

myseq = (xs, 1, True, ys, 'hello')


print(array_in_tuple(xs, myseq), array_in_tuple(ys, myseq), array_in_tuple(np.array([7, 8, 9]), myseq))
...