Объединение двух NumPy 2D массивов - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь объединить / объединить два numpy массива на основе некоторого столбца наиболее эффективным способом.

Вот мои два numpy массива:

import numpy as np

a1 = np.array([('a', 4.672, 0.999),
   ('b', 2.24, 0.999),
   ('c', 1.984, 0.9001),])

a2 = np.array([('a', 4.67),
   ('c', 2.24)])

Вот моя функция, которая возвращает массив строк индексов размера a1, соответствующих первому столбцу a2 . Я использую это позже, чтобы сделать массив одинакового размера и объединить. Поэтому мне нужно [0, -, 1] для a1, который дает индекс совпадающих строк для a2.

def find_indices(x, y):
    x = x[:, 0]
    y = y[:, 0]

    index = np.argsort(x)
    sorted_x = x[index]
    sorted_index = np.searchsorted(sorted_x, y)

    yindex = np.take(index, sorted_index, mode="clip")
    mask = x[yindex] != y

    result = np.ma.array(yindex, mask=mask)

    return result

find_indices(a2, a1)

Это возвращает этот массив, который кажется хорошим. .data, я получаю реплицированные данные,

a2[idx.data]

array([['a', '4.67'],
   ['c', '2.24'],
   ['c', '2.24']], dtype='<U4')

, тогда как вывод должен быть:

array([['a', '4.67'],
             --     , 
       ['c', '2.24']], dtype='<U4')

Как исправить эту ошибку?

1 Ответ

0 голосов
/ 14 января 2020

Наконец, я нашел решение:

idx = find_indices(a2, a1)

d = a2[idx]
d[idx.mask] = np.nan

merged_array = np.concatenate((a1, d), axis=1)

Я использую маску, чтобы заменить дублирующиеся значения на Nan. Затем непосредственно объединить.

...