Ошибка (?) С индексацией - PullRequest
0 голосов
/ 04 сентября 2018

Я пытался создать своего рода 2d-фильтр с numpy, и я нашел что-то похожее на ошибку.

В приведенном ниже примере я пытаюсь настроить таргетинг на 2-й и 4-й столбцы первой, второй и последней строк моих данных, например:

[[ 2  4]
 [ 8 10]
 [26 28]] 

Я знаю, что вторая-последняя строка возвращает это, но я не смог бы ничего там назначить (он возвращает копию). И это все еще не объясняет, почему последний провалился.

import numpy as np

# create my data: 5x6 array
data = np.arange(0,30).reshape(5,6)

# mask: only keep row 1,2,and 5
mask = np.array([1,1,0,0,1])
mask = mask.astype(bool)

# this is fine
print 'data\n', data, '\n'

# this is good
print 'mask\n', mask, '\n'

# this is nice
print 'data[mask]\n', data[mask], '\n'

# this is great
print 'data[mask, 2]\n', data[mask, 2], '\n'

# this is awesome
print 'data[mask][:,[2,4]]\n', data[mask][:,[2,4]], '\n'

# this fails ??
print 'data[mask, [2,4]]\n', data[mask, [2,4]], '\n'

выход:

data
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]
 [24 25 26 27 28 29]] 

mask
[ True  True False False  True] 

data[mask]
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [24 25 26 27 28 29]] 

data[mask, 2]
[ 2  8 26] 

data[mask][:,[2,4]]
[[ 2  4]
 [ 8 10]
 [26 28]] 

data[mask, [2,4]]
Traceback (most recent call last):
[...]
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,)

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

Спасибо за вашу помощь / обратную связь!

1 Ответ

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

Это не ошибка.

Это определение реализации

Если вы прочитали индексирование массива в разделе Расширенное индексирование, вы заметите, что оно говорит

Чисто целочисленная индексация массива, когда индекс состоит из целочисленные массивы, так как индексируемый массив имеет измерения, индексирование прямо вперед, но отличается от нарезки. Расширенные индексы всегда транслируются и повторяются как один:

result[i_1, ..., i_M] == x[ind_1[i_1, ..., i_M], ind_2[i_1, ..., i_M],
                       ..., ind_N[i_1, ..., i_M]]

поэтому

print 'data[mask, [2,4]]\n', data[mask, [1,2,4]], '\n'

работает и выводит

data[mask, [1,2,4]]
[ 1  8 28]

длина индекса в трансляции должна быть одинаковой

Может быть, вы можете достичь того, что вы хотите, используя функцию ix_. См индексирование массива

columns = np.array([2, 4], dtype=np.intp)
print data[np.ix_(mask, columns)]

который выводит

[[ 2  4]
 [ 8 10]
 [26 28]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...