Как использовать встроенный `slice` для доступа к 2-м блокам в 2-м массиве? - PullRequest
1 голос
/ 20 февраля 2020

У меня есть массив 2-d numpy, для которого я хотел бы модифицировать 2-d блоки (например, субблок 3x3 на доске судоку 9x9). Вместо использования необычного индексирования я хотел бы использовать встроенный slice. Есть ли способ сделать эту работу? Я думаю, что аргумент шага (третий аргумент slice) может быть использован, чтобы сделать это как-то, но я не могу понять это. Моя попытка ниже.

import numpy as np

# make sample array (dim-1)
x = np.linspace(1, 81, 81).astype(int)
i = slice(0, 3)

print(x[i])
# [1 2 3]

# make sample array (dim-2)
X = x.reshape((9, 9))

Скажем, я хотел получить доступ к первым 3 строкам и первым 3 столбцам X. Я могу сделать это с необычной индексацией как:

print(X[:3, :3])
# [[ 1  2  3]
#  [10 11 12]
#  [19 20 21]]

Попытка использовать логи c, аналогичные случаю dim-1 с slice:

j = np.array([slice(0,3), slice(0,3)]) # wrong way to acccess 
print(X[j])

Выдает следующую ошибку :

IndexError: arrays used as indices must be of integer (or boolean) type

1 Ответ

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

Если вы используете индекс X[:3, :3], то за занавесом вы пропускаете кортеж , поэтому (slice(3), slice(3)).

Таким образом, вы можете создать j с помощью:

j = <b>(</b>slice(3)<b>,</b> slice(3)<b>)</b>

или вы можете получить блок a, b с помощью:

j = (slice(3*a, 3*a+3), slice(3*b, 3*b+3))

, поэтому здесь a=0 и b=1, например, приведут к части X[0:3, 3:6]. Таким образом, блок, который содержит первые три строки и вторые три столбца.

или вы можете сделать кортеж с переменным числом элементов. Например, для n -мерного массива вы можете создать n -кортеж, каждый из которых имеет slice(3) объект:

j = (slice(3),)<b> * n</b>
...