Найти индекс, соответствующий между двумя списками массивов разных размеров с одинаковыми общими элементами - PullRequest
1 голос
/ 23 мая 2019

Как найти соответствующие индексы массивов в двух массивах массивов разной формы одинакового размера?

Например, массив x размера 36 разбит на 11 массивов.Другой массив y размером 36 разбит на 4 массива.Затем происходят некоторые модификации на 4 массивах, составляющих y.

N  = 6 #some size param
x = np.zeros(N*N,dtype=np.int) #make empty array
s1 = np.array_split(x,11) #split array into arbitrary parts

y = np.random.randint(5, size=(N, N)) #make another same size array (and modify it)
s2 = np.array_split(y,4) #split array into different number of parts

Затем итерируя по 4 массивам y, мне нужно найти начальный индекс в первом массиве (array_num) s1, до конечного индекса последнего массиваs1 что значения в s2 соответствуют.

for sub_s2 in s2:
    array_num = ?
    s_idx = ?
    e_idx = ?

    s2_idx = ?
    e2_idx = ?

    #put the array into the correct ordered indexes of the other array
    s1[array_num][s_idx,e_idx] = sub_s2[s2_idx,e2_idx]

res = np.concatenate(s1)

Я сделал это изображение, чтобы попытаться проиллюстрировать проблему.В этом случае «данные» означают размер x и y для начала.Затем s1 и s2 разбиваются на разные фрагменты, и проблема заключается в поиске индекса в каждом фрагменте, которому соответствуют массивы в s2.enter image description here

1 Ответ

0 голосов
/ 23 мая 2019

Вот как найти правильные показатели:

# create example use same data for both splits for easy validation
a = np.arange(36)

s1 = np.array_split(a, 11)
s2 = np.array_split(a, 4)

# recover absolute offsets of bit boundaries 
l1 = np.cumsum([0, *map(len,s1)])
l2 = np.cumsum([0, *map(len,s2)])

# find bits in s1 into which the first ...
start_n = l1[1:].searchsorted(l2[:-1], 'right')
# ... and last elements of bits of s2 fall
end_n = l1[1:].searchsorted(l2[1:]-1, 'right')

# find the corresponding indices into bits of s1
start_idx = l2[:-1] - l1[start_n]
end_idx = l2[1:]-1 - l1[end_n]

# check
[s[0] for s in s2]
# [0, 9, 18, 27]
[s1[n][i] for n, i in zip(start_n, start_idx)]
# [0, 9, 18, 27]
[s[-1] for s in s2]
# [8, 17, 26, 35]
[s1[n][i] for n, i in zip(end_n, end_idx)]
# [8, 17, 26, 35]
...