Многомерное индексирование по строкам в NumPy (избегая трансляции) - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь проиндексировать 2-мерный нудистый ndarray с помощью другого 2-мерного нудистого ndarray.

Эффект, который я хотел бы, чтобы каждая строка в массиве индексации выбирала элементы в соответствующей строкеИндексируемый массив.То есть я хотел бы, чтобы строка i или мой индексный массив индексировали элементы строки i индексируемого массива (но не других строк).

В настоящее время, однако, кажется, что когда я пытаюсь проиндексировать свой массивиндексный массив транслируется по каждой строке индексируемого массива.

Массивы, с которыми я работаю, - это (3, 1001) массив и (3, 5) массив.Я пытаюсь проиндексировать массив (3, 1001) с помощью массива (3, 5) и выбрать 5 элементов из каждой 1001-мерной строки индексируемого массива.

Например, вот поведение, которое яwant:

predictions_val[0][top_5[0]]
array([ 0.00222665,  0.00606673,  0.03681596,  0.85334235,  0.01018796], dtype=float32)

predictions_val[1][top_5[1]]
array([ 0.00106781,  0.00407206,  0.026693  ,  0.90732217,  0.0234713 ], dtype=float32)

predictions_val[2][top_5[2]]
array([ 0.00112946,  0.0016792 ,  0.06700196,  0.00367496,  0.87981129], dtype=float32)

Вот поведение, которое я получаю при попытке одновременного индексирования:

predictions_val[:,top_5]
array([[[  2.22665281e-03,   6.06672745e-03,   3.68159562e-02,
           8.53342354e-01,   1.01879649e-02],
        [  5.12826555e-05,   8.53342354e-01,   1.41255208e-03,
           2.77817919e-04,   1.01879649e-02],
        [  2.17145571e-04,   2.77817919e-04,   8.53342354e-01,
           1.41255208e-03,   1.01879649e-02]],

       [[  5.50073055e-05,   8.74355683e-05,   2.71841218e-05,
           4.07205941e-03,   2.34712958e-02],
        [  1.06781046e-03,   4.07205941e-03,   2.66929977e-02,
           9.07322168e-01,   2.34712958e-02],
        [  5.84539608e-04,   9.07322168e-01,   4.07205941e-03,
           2.66929977e-02,   2.34712958e-02]],

       [[  1.05086729e-04,   2.83752568e-04,   7.68712547e-04,
           6.70019612e-02,   8.79811287e-01],
        [  4.69864433e-04,   6.70019612e-02,   3.67495860e-03,
           1.67920033e-03,   8.79811287e-01],
        [  1.12945912e-03,   1.67920033e-03,   6.70019612e-02,
           3.67495860e-03,   8.79811287e-01]]], dtype=float32)

Каждая нужная мне строка существует в возвращаемых массивах, но кажется, что top_5массив транслируется по самому ряду.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вы должны правильно проиндексировать свои данные.np.indices может помочь в этом:

pred=rand(3,1001)
top=randint(0,1001,(3,5))

I,J=indices(top.shape)
res=pred[I,top]

, тогда res[i] для i in {0,1,2} - это то, что вы хотите.

0 голосов
/ 21 сентября 2018

Вы должны сделать что-то похожее на приведенное ниже;

X = ... # your data, shape (3,1001)
idx = ... # the wanted indices, shape (3,5)

# reshape idx to (2,idx.shape[0]*idx.shape[1])
idx = np.array([[i,index] for i in range(X.shape[0]) for index in idx[i]]).tranpose()

Wanted = X[idx[0],idx[1]]

Это создаст массив idx, где первая строка - это искомая строка в X, а вторая строка - искомый столбец.в X.

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