Объединить два массива numpy, чтобы порядок индексов оставался прежним? - PullRequest
0 голосов
/ 17 февраля 2020

Предположим, у меня есть два numpy массива следующим образом:

{0: array([ 2, 4, 8, 9, 12], dtype=int64),
1: array([ 1, 3, 5], dtype=int64)}

Теперь я хочу заменить каждый массив идентификатором спереди, то есть значения в массиве 0 станут 0, а в массиве 1 станут 1, тогда оба массива должны быть объединены, в результате чего порядок индекса должен быть правильным. Т.е. желаемый вывод:

array([1, 0, 1, 0, 1, 0, 0 ,0])

Но вот что я получаю:

np.concatenate((h1,h2), axis=0)
array([0, 0, 0, 0, 0, 1, 1, 1])

(Каждый массив содержит только уникальные значения, если это помогает.)

Как это можно быть сделано?

Ответы [ 3 ]

1 голос
/ 18 февраля 2020

Ваше описание слияния немного неясно. Но есть кое-что, что имеет смысл

In [399]: dd ={0: np.array([ 2, 4, 8, 9, 12]), 
     ...: 1: np.array([ 1, 3, 5])}                                                             

In [403]: res = np.zeros(13, int)                                                              
In [404]: res[dd[0]] = 0                                                                       
In [405]: res[dd[1]] = 1                                                                       
In [406]: res                                                                                  
Out[406]: array([0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0])

Или чтобы сделать назначения более четкими:

In [407]: res = np.zeros(13, int)                                                              
In [408]: res[dd[0]] = 2                                                                       
In [409]: res[dd[1]] = 1                                                                       
In [410]: res                                                                                  
Out[410]: array([0, 1, 2, 1, 2, 1, 0, 0, 2, 2, 0, 0, 2])

В противном случае позиции индекса разговора не имеют большого смысла.

0 голосов
/ 18 февраля 2020

Как то так?

d = {0: array([ 2, 4, 8, 9, 12], dtype=int64),
     1: array([ 1, 3, 5], dtype=int64)}

(np.concatenate([d[0],d[1]]).argsort(kind="stable")>=len(d[0])).view(np.uint8)
# array([1, 0, 1, 0, 1, 0, 0, 0], dtype=uint8)
0 голосов
/ 17 февраля 2020

.concatenate Просто добавляет списки / массивы.

Возможно, нетрадиционный способ go об этом, но вы можете повторить шаблон [0 1] для len самого короткого массива, используя numpy.repeat и затем добавить повторяющиеся 1 значения для разности двух массивов?

if len(h1) > len(h2):
   temp = len(h2)
else:
   temp = len(h1)

diff = abs(h1-h2)

for i in range(temp):
   A = numpy.repeat(0, 1)

for i in range(diff):
   B = numpy.repeat(1)

C = numpy.concatenate((A,B), axis=0)

Может быть, не самый динамичный c или самый добрый способ go по этому поводу, но если ваше решение требует только что, тогда он может сделать работу в то же время.

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