Вставить данные из одного отсортированного массива в другой отсортированный массив - PullRequest
2 голосов
/ 26 января 2012

Я прошу прощения, если это было задано здесь - я охотился здесь и в предварительном учебнике NumPy для ответа.

У меня есть 2 массива. Первый массив похож на:

1 0 0 0 0

2 0 0 0 0

3 0 0 0 0

4 0 0 0 0

5 0 0 0 0

6 0 0 0 0

7 0 0 0 0

8 0 0 0 0

(и т. Д. Это ~ 700x10 в действительности)

У меня есть второй массив, похожий на

3 1

4 18

5 2

(опять же, длиннее - может быть, около 400 строк)

Первый столбец 2-го массива всегда полностью содержится в первом столбце первого массива

Что я хотел бы сделать, это вставить 2-й столбец 2-го массива в этот первый массив как часть существующего столбца, т. Е.

массив a:

1 0 0 0 0

2 0 0 0 0

3 1 0 0 0

4 18 0 0 0

5 2 0 0 0

6 0 0 0 0

7 0 0 0 0

8 0 0 0 0

(я бы заполнил каждый из этих столбцов по очереди, но каждый из них охватывает свой диапазон в оригинале)

Моя первая попытка была выполнена по принципу a [b [:, 0], 1] = b [:, 1], который помещает их в индексы b, а не в значения (т. Е. В моем примере выше вместо заполняя строки 3, 4 и 5, я заполнил 2, 3 и 4). Я должен был это понять!

С тех пор я пытался заставить его работать довольно неравномерно с where (), и, думаю, я мог бы заставить его работать, находя разницу в начальных значениях первых столбцов.

Я новичок в python, так что, возможно, я слишком оптимистичен - но, похоже, должен быть более элегантный способ, и я просто скучаю по нему.

Спасибо за любые идеи!

Ответы [ 2 ]

5 голосов
/ 26 января 2012

Если числа в первом столбце a расположены в отсортированном порядке, вы можете использовать

a[a[:,0].searchsorted(b[:,0]),1] = b[:,1]

Например:

import numpy as np

a = np.array([(1,0,0,0,0),
              (2,0,0,0,0),
              (3,0,0,0,0),
              (4,0,0,0,0),
              (5,0,0,0,0),
              (6,0,0,0,0),
              (7,0,0,0,0),
              (8,0,0,0,0),
              ])

b = np.array([(3, 1),
              (5, 18),
              (7, 2)])

a[a[:,0].searchsorted(b[:,0]),1] = b[:,1]
print(a)

выход

[[ 1  0  0  0  0]
 [ 2  0  0  0  0]
 [ 3  1  0  0  0]
 [ 4  0  0  0  0]
 [ 5 18  0  0  0]
 [ 6  0  0  0  0]
 [ 7  2  0  0  0]
 [ 8  0  0  0  0]]

(Я немного изменил ваш пример, чтобы показать, что значения в первом столбце b не обязательно должны быть смежными.)


Если a[:,0] не в порядке сортировки, тогда вы можете использовать np.argsort, чтобы обойти это:

a = np.array( [(1,0,0,0,0),
               (2,0,0,0,0),
               (5,0,0,0,0),
               (3,0,0,0,0),
               (4,0,0,0,0),
               (6,0,0,0,0),
               (7,0,0,0,0),
               (8,0,0,0,0),
               ])

b = np.array([(3, 1),
              (5, 18),
              (7, 2)])

perm = np.argsort(a[:,0])
a[:,1][perm[a[:,0][perm].searchsorted(b[:,0])]] = b[:,1]
print(a)

приводит к

[[ 1  0  0  0  0]
 [ 2  0  0  0  0]
 [ 5 18  0  0  0]
 [ 3  1  0  0  0]
 [ 4  0  0  0  0]
 [ 6  0  0  0  0]
 [ 7  2  0  0  0]
 [ 8  0  0  0  0]]
0 голосов
/ 26 января 2012

Настройка:

a = np.arange(20).reshape(2,10).T
b = np.array([[1, 100], [3, 300], [8, 800]])

Это будет работать, если вы ничего не знаете о [:, 0], за исключением того, что он отсортирован.

index = a[:, 0].searchsorted(b[:, 0])
a[index, 1] = b[:, 1]
print a
array([[  0,  10],
       [  1, 100],
       [  2,  12],
       [  3, 300],
       [  4,  14],
       [  5,  15],
       [  6,  16],
       [  7,  17],
       [  8, 800],
       [  9,  19]])

Но если вы знаете, что a[:, 0] - это последовательность непрерывных целых чисел, как в вашем примере, вы можете сделать:

index = b[:,0] + a[0, 0]
a[index, 1] = b[:, 1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...