Если вы хотите пропустить каждую другую строку и каждый другой столбец, вы можете сделать это с помощью базовой нарезки:
In [49]: x=np.arange(16).reshape((4,4))
In [50]: x[1:4:2,1:4:2]
Out[50]:
array([[ 5, 7],
[13, 15]])
Это возвращает представление, а не копию вашего массива.
In [51]: y=x[1:4:2,1:4:2]
In [52]: y[0,0]=100
In [53]: x # <---- Notice x[1,1] has changed
Out[53]:
array([[ 0, 1, 2, 3],
[ 4, 100, 6, 7],
[ 8, 9, 10, 11],
[ 12, 13, 14, 15]])
, в то время как z=x[(1,3),:][:,(1,3)]
использует расширенную индексацию и, таким образом, возвращает копию:
In [58]: x=np.arange(16).reshape((4,4))
In [59]: z=x[(1,3),:][:,(1,3)]
In [60]: z
Out[60]:
array([[ 5, 7],
[13, 15]])
In [61]: z[0,0]=0
Обратите внимание, что x
не изменяется:
In [62]: x
Out[62]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
Если вы хотите выбрать произвольные строки и столбцы, тогда вы не можете использовать базовую нарезку. Вам нужно будет использовать расширенную индексацию, используя что-то вроде x[rows,:][:,columns]
, где rows
и columns
- это последовательности. Это, конечно же, даст вам копию, а не представление, вашего исходного массива. Это так, как и следовало ожидать, поскольку массив numpy использует непрерывную память (с постоянными шагами), и не было бы способа создать представление с произвольными строками и столбцами (поскольку для этого потребовались бы непостоянные шаги).