Под прикрытием повторные функции обычно создают новый dtype и «пустой» массив результатов.Затем они копируют значения по имени поля.Я не изучал join_by
, но могу представить, что ваше объединение выглядит так:
In [11]: a.dtype
Out[11]: dtype([('name', '<U10'), ('age', '<f8')])
In [12]: b.dtype
Out[12]: dtype([('age', '<f8'), ('senior', '<i4')])
In [13]: b.dtype[1]
Out[13]: dtype('int32')
In [14]: b.dtype.descr
Out[14]: [('age', '<f8'), ('senior', '<i4')]
In [16]: dt = np.dtype(a.dtype.descr+[b.dtype.descr[1]])
In [17]: dt
Out[17]: dtype([('name', '<U10'), ('age', '<f8'), ('senior', '<i4')])
In [18]: e = np.zeros(a.shape, dt)
In [19]: for name in a.dtype.names:
...: e[name] = a[name]
...:
In [21]: e
Out[21]:
array([('Alex', 25., 0), ('Billy', 25., 0), ('Charlie', 75., 0),
('Dave', 75., 0)],
dtype=[('name', '<U10'), ('age', '<f8'), ('senior', '<i4')])
С небольшим методом проб и ошибок я нашел такой способ соединения возрастов b
с a
(сейчас e
) единицы:
In [23]: e['age'][:,None]==b['age']
Out[23]:
array([[ True, False],
[ True, False],
[False, True],
[False, True]])
In [25]: np.where(Out[23])
Out[25]: (array([0, 1, 2, 3]), array([0, 0, 1, 1]))
Теперь просто скопируйте соответствующие «старшие» значения из b
в e
:
In [27]: e['senior'][Out[25][0]] = b['senior'][Out[25][1]]
In [28]: e
Out[28]:
array([('Alex', 25., 0), ('Billy', 25., 0), ('Charlie', 75., 1),
('Dave', 75., 1)],
dtype=[('name', '<U10'), ('age', '<f8'), ('senior', '<i4')])
Базовая логика независит от этих структурированных массивов.У нас точно так же есть отдельные 1d-массивы names
, ages
, senior_category_age
и т. Д.
recfunctions
не находит большого применения - как видно из отдельной упаковки, ииз ограниченных вопросов ТАК.Однако недавние изменения в многополевом индексировании, я думаю, повысят его использование, по крайней мере, для вновь добавленных функций.
https://docs.scipy.org/doc/numpy/user/basics.rec.html#accessing-multiple-fields