Numpy, чтобы получить точные аргументы дублированных элементов в двумерном массиве - PullRequest
1 голос
/ 06 ноября 2019

У меня есть два 2D-массива a и b. Я хочу найти точные индексы a в b. Я следовал предложенному решению здесь .

Проблема в том, что мои массивы содержат дубликаты, как вы можете видеть здесь:

# The shape of b is (50, 2)
b = np.array([[ 0,  1],[ 2,  3],[ 4,  5],[ 6,  7], [ 0,  1],
             [10, 11], [12, 13], [14, 15], [16, 17], [10, 11],
             [20, 21], [22, 23], [24, 25], [26, 27], [20, 21],
             [30, 31], [32, 33], [34, 35], [36, 37], [30, 31],
             [40, 41], [42, 43], [44, 45], [46, 47], [40, 41],
             [50, 51], [52, 53], [54, 55], [56, 57], [50, 51],
             [60, 61], [62, 63], [64, 65], [66, 67], [60, 61],
             [70, 71], [72, 73], [74, 75], [76, 77], [70, 71],
             [80, 81], [82, 83], [84, 85], [86, 87], [80, 81],
             [90, 91], [92, 93], [94, 95], [96, 97], [90, 91]])

# The shape of a is (20,2)
a = np.array([[ 0,  1],[ 2,  3], [ 4,  5],[ 6,  7],[ 0,  1],
       [50, 51],[52, 53], [54, 55], [56, 57], [50, 51],
       [20, 21], [22, 23], [24, 25], [26, 27], [20, 21],
       [70, 71], [72, 73], [74, 75], [76, 77], [70, 71]])

Теперь, когда я пытаюсь что-то вроде этого:

# See the link above approach 2
def view1D(a, b): # a, b are arrays
    a = np.ascontiguousarray(a)
    b = np.ascontiguousarray(b)
    void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))
    return a.view(void_dt).ravel(),  b.view(void_dt).ravel()

def argwhere_nd_searchsorted(a,b):
    A,B = view1D(a,b)
    sidxB = B.argsort()
    mask = np.isin(A,B)
    cm = A[mask]
    idx0 = np.flatnonzero(mask)
    idx1 = sidxB[np.searchsorted(B,cm, sorter=sidxB)]
    return idx0, idx1 # idx0 : indices in A, idx1 : indices in B

args0, args1 = argwhere_nd_searchsorted(a,b)

приводит к:

#args0
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,17, 18, 19])

#args1
 array([ 0,
  1,
  2,
  3,
  0, # this sould be 4
 25,
 26,
 27,
 28,
 25, # this sould be 29
 10,
 11,
 12,
 13,
 10,# this should be 14
 39,# this should be 35
 36,
 37,
 38,
 39])
# if we check
np.equal(b[args1],a).all() # This returns True

Как видите, проблема в args1 подсвеченных индексах повторяется. Мой ожидаемый результат показан в закомментированных строках.

Любая помощь приветствуется

1 Ответ

1 голос
/ 06 ноября 2019

Мы могли бы добавить еще один столбец идентификаторов для представления дубликатов в строках, а затем использовать те же шаги. Мы будем использовать панд для получения этих идентификаторов, просто так будет проще. Следовательно, просто сделайте -

import pandas as pd

def assign_duplbl(a):
    df = pd.DataFrame(a)
    df['num'] = 1
    return df.groupby(list(range(a.shape[1]))).cumsum().values

a1 = np.hstack((a,assign_duplbl(a)))
b1 = np.hstack((b,assign_duplbl(b)))
args0, args1 = argwhere_nd_searchsorted(a1,b1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...