Как найти индекс кортежа в двумерном массиве в python? - PullRequest
1 голос
/ 12 апреля 2020

У меня есть массив в следующей форме (с гораздо большим количеством элементов):

coords = np.array(
    [[(2, 1), 1613, 655],
     [(2, 5), 906, 245],
     [(5, 2), 0, 0]])

И я хотел бы найти индекс указанного c кортежа. Например, я могу искать позицию кортежа (2, 5), которая в этом случае должна быть в позиции 1.

Я пробовал с np.where и np.argwhere, но безуспешно :

pos = np.argwhere(coords == (2,5))
print(pos)
>> DeprecationWarning: elementwise comparison failed; this will raise an error in the future.

pos = np.where(coords == (2,5))
print(pos)
>> DeprecationWarning: elementwise comparison failed; this will raise an error in the future.

Как получить индекс кортежа?

Ответы [ 5 ]

0 голосов
/ 12 апреля 2020

Предполагая, что ваш целевой кортеж (например, (2,5)) всегда находится в первом столбце массива numpy coords, т.е. coords[:,0], вы можете просто сделать следующее без каких-либо циклов!

[*coords[:,0]].index((2,5))

Если кортежи не обязательно находятся в первом столбце всегда, тогда вы можете использовать

[*coords.flatten()].index((2,5))//3

Надеюсь, что это поможет.

0 голосов
/ 12 апреля 2020

Если вы намереваетесь использовать массив numpy, содержащий объекты, все сравнения будут выполняться с использованием самого python. В этот момент вы отказались почти от всех преимуществ numpy и можете также использовать список:

coords = coords.tolist()
index = next((i for i, n in enumerate(coords) if n[0] == (2, 5)), -1)

Если вы действительно хотите использовать numpy, я предлагаю вам соответствующим образом преобразовать ваши данные , На ум приходят два простых варианта. Вы можете либо расширить свой кортеж и создать массив формы (N, 4), либо вы можете создать структурированный массив, который сохраняет расположение данных как единое целое и имеет форму (N,). Первое намного проще, а последнее, на мой взгляд, более элегантно.

Если вы сгладите координаты:

coords = np.array([[x[0][0], x[0][1], x[1], x[2]] for x in coords])
index = np.flatnonzero(np.all(coords[:, :2] == [2, 5], axis=1))

Структурированное решение:

coordt = np.dtype([('x', np.int_), ('y', np.int_)])
dt = np.dtype([('coord', coordt), ('a', np.int_), ('b', np.int_)])

coords = np.array([((2, 1), 1613, 655), ((2, 5), 906, 245), ((5, 2), 0, 0)], dtype=dt)

index = np.flatnonzero(coords['coord'] == np.array((2, 5), dtype=coordt))

Вы также можете просто преобразовать первую часть ваших данных в реальный массив numpy и работать с ним:

coords = np.array(coords[:, 0].tolist())
index = np.flatnonzero((coords == [2, 5]).all(axis=1))
0 голосов
/ 12 апреля 2020

Прежде всего, кортеж (2, 5) находится в позиции 0, поскольку он является первым элементом списка [(2, 5), 906, 245].
И, во-вторых, вы можете использовать функции basi c python для проверки индекс кортежа в этом массиве. Вот как вы это делаете:

>>> coords = np.array([[(2, 1), 1613, 655], [(2, 5), 906, 245], [(5, 2), 0, 0]])
>>> 
>>> coords_list = cl = list(coords)
>>> cl
[[(2, 1), 1613, 655], [(2, 5), 906, 245], [(5, 2), 0, 0]]
>>> 
>>> tuple_to_be_checked = tuple_ = (2, 5)
>>> tuple_
(2, 5)
>>> 
>>> for i in range(0, len(cl), 1):  # Dynamically works for any array `cl`
        for j in range(0, len(cl[i]), 1):  # Dynamic; works for any list `cl[i]`
            if cl[i][j] == tuple_:  # Found the tuple
                # Print tuple index and containing list index
                print(f'Tuple at index {j} of list at index {i}')
                break  # Break to avoid unwanted loops

Tuple at index 0 of list at index 1
>>> 
0 голосов
/ 12 апреля 2020

Попробуйте это

import numpy as np
coords = np.array([[(2, 1), 1613, 655], [(2, 5), 906, 245], [(5, 2), 0, 0]])
tpl=(2,5)
i=0 # index of the column in which the tuple you are looking for is listed

pos=([t[i] for t in coords].index(tpl))
print(pos)
0 голосов
/ 12 апреля 2020

Вы не должны сравнивать (2, 5) и координаты, но должны сравнивать (2, 5) и координаты [:, 0].

Попробуйте этот код.

np.where([np.array_equal(coords[:, 0][i], (2, 5)) for i in range(len(coords))])[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...