У меня есть 2 массива разных размеров m и n, например:

x = np.asarray([100, 200])
y = np.asarray([300, 400, 500])

У меня также есть целочисленный массив размером m+n, например:

indices = np.asarray([1, 1, 0, 1 , 0])

Я хотел бы объединить x и y в массив z размера m+n, в этом случае:

expected_z = np.asarray([300, 400, 100, 500, 200])

Подробно:

  • 1-е значение indices равно 1, поэтому 1-е значение z должно быть из y. Поэтому 300.
  • Второе значение indices равно 1, поэтому второе значение z также должно быть из y. Поэтому 400
  • Третье значение indices равно 0, поэтому третье значение z должно быть на этот раз от x. Поэтому 100
  • ...

Как я могу сделать это эффективно в NumPy?

Заранее спасибо!

0
Florian Pagnoux 3 Май 2019 в 00:41

3 ответа

Лучший ответ

Создайте выходной массив и используйте логическое индексирование, чтобы назначить x и y в правильные слоты вывода:

z = numpy.empty(len(x)+len(y), dtype=x.dtype)
z[indices==0] = x
z[indices==1] = y
0
user2357112 supports Monica 2 Май 2019 в 22:32

Надеюсь, это может вам помочь:

x          = np.asarray([100, 200])
y          = np.asarray([300, 400, 500])
indices    = np.asarray([1, 1, 0, 1 , 0])
expected_z = np.asarray([])
x_indice   = 0
y_indice   = 0

for i in range(0,len(indices)):
    if indices[i] == 0:
        expected_z = np.insert(expected_z,i,x[x_indice])
        x_indice += 1
    else:
        expected_z = np.insert(expected_z,i,y[y_indice])
        y_indice += 1

expected_z

И вывод:

output : array([300., 400., 100., 500., 200.])

Постскриптум всегда проверяйте, что len(indices) == len(x) + len(y) и:

  • значения, которые приходят от y == len (y)
  • значения, которые приходят из х == len (x)
-1
Mehdi Hadji 2 Май 2019 в 22:25

out будет вашим желаемым результатом:

out = indices.copy()
out[np.where(indices==0)[0]] = x
out[np.where(indices==1)[0]] = y

Или, как предложено выше, просто сделайте:

out = indices.copy()
out[indices==0] = x
out[indices==1] = y
0
Monaj 2 Май 2019 в 22:37