Конкатенация массивов numpy при условии - PullRequest
0 голосов
/ 20 сентября 2019

Мне было интересно, был ли какой-нибудь тупой способ объединить 2 массива различных len (a и b) вдоль оси, основанной на логическом одном из (len a + b)

Я уже могусделать этот массив с пониманием списка Python (в соответствии с логическим значением) или с созданием нескольких новых массивов (2).

Простой пример:

import numpy as np

a = np.arange(3)
b = np.arange(3, 8)
a_b = np.arange(8) < 3

def np_or_not(a_b, a, b, axis=-1):
    axis = axis // len(a_b)
    aligned_a = np.take(a, np.cumsum(a_b) - 1, axis=axis)
    aligned_b = np.take(b, np.cumsum(~a_b) - 1, axis=axis)
    return np.where(a_b, aligned_a, aligned_b)

assert (np_or_not(a_b, a, b) == np.arange(8)).all()

ND case:

Инициализация

axis = 2
a = np.random.rand(10, 20, 4)
b = np.random.rand(10, 20, 9)
a_b = np.array([True] * a.shape[axis] + [False] * b.shape[axis])
np.random.shuffle(a_b)

Проверки (форматы)

assert len(a.shape) == len(b.shape)
assert all(a.shape[ax] == b.shape[ax] for ax in range(len(a.shape)) if ax != axis)
assert len(a_b) == (a.shape[axis] + b.shape[axis])
assert sum(a_b) == a.shape[axis]
assert sum(~a_b) == b.shape[axis]

Проверяет результаты

result = np_or_not(a_b, a, b, axis=-1)

assert result.shape == tuple(l if ax != axis else len(a_b) for ax, l in enumerate(a.shape))

a_b_indexes = [0, 0]
for index, truth in enumerate(a_b):
    assert (result[..., index] == (a if truth else b)[..., a_b_indexes[1 - truth]]).all(), index
    a_b_indexes[1 - truth] += 1

РЕДАКТИРОВАТЬ : Спасибо за ответ, я заменил укладкупутем конкатенации и предоставил пример прецедента ND.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...