используя список или диапазон в NumPy в качестве строки - PullRequest
0 голосов
/ 03 декабря 2018

Как я могу использовать диапазон в numpy, чтобы получить ячейку в области?Я могу использовать from:to, но я могу использовать список для установки диапазона строк?

import numpy as np
mx = np.arange(25).reshape(5,5)
print(mx)
print(mx[1:3, 2:4])
k = 1
print(mx[range(k, k+3), range(k+1, k+5)])

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Чтобы использовать список или массив в индексировании 2d, вам нужно подумать о том, что broadcasting:

In [263]: mx = np.arange(25).reshape(5,5)
In [264]: mx[1:3, 2:4]
Out[264]: 
array([[ 7,  8],
       [12, 13]])
In [265]: mx[np.arange(1,3)[:,None], np.arange(2,4)]
Out[265]: 
array([[ 7,  8],
       [12, 13]])

np.ix_ делает это проще:

In [266]: np.ix_(np.arange(1,3), np.arange(2,4))
Out[266]: 
(array([[1],
        [2]]), array([[2, 3]]))
In [267]: mx[np.ix_(np.arange(1,3), np.arange(2,4))]
Out[267]: 
array([[ 7,  8],
       [12, 13]])

илито же самое со списками:

In [268]: mx[[[1],[2]], [2,3]]
Out[268]: 
array([[ 7,  8],
       [12, 13]])

Индексирует строки 1 и 2, а столбцы 2 и 3 - в декартовом смысле, а не попарно.

In [269]: mx[[1,2], [2,3]]     # diagonal of the block
Out[269]: array([ 7, 13])
0 голосов
/ 03 декабря 2018

Я не думаю, что вы можете использовать range или arange таким образом (хотя смотрите ответ @ hpaulj ), но вы можете использовать slice, чтоиспользует тот же синтаксис, что и диапазон ( т.е. вы даете ему начало, остановку и, необязательно, аргумент шага):

mx[slice(k, k+3), slice(k+1,k+5)]

Это эквивалентно:

mx[k:k+3, k+1:k+5]

Например:

>>> mx[slice(k, k+3), slice(k+1,k+5)]
array([[ 7,  8,  9],
       [12, 13, 14],
       [17, 18, 19]])

>>> mx[k:k+3, k+1:k+5]
array([[ 7,  8,  9],
       [12, 13, 14],
       [17, 18, 19]])

Для получения дополнительной информации см. Также запись глоссария для slice объектов

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