В numpy, почему многомерный массив d[0][0:2][0][0] возвращая не два элемента

#python #arrays #numpy

#python #массивы #numpy

Вопрос:

 In [136]: d = np.ones((1,2,3,4))

In [167]: d[0][0][0:2][0]
Out[167]: array([ 1.,  1.,  1.,  1.])
 

как показано выше, почему он не возвращает ровно 2 элемента

Ответ №1:

Посмотрите на сам массив. Это должно быть понятно само по себе

 >>> d
array([[[[ 1.,  1.,  1.,  1.],
         [ 1.,  1.,  1.,  1.],
         [ 1.,  1.,  1.,  1.]],

        [[ 1.,  1.,  1.,  1.],
         [ 1.,  1.,  1.,  1.],
         [ 1.,  1.,  1.,  1.]]]])
# first you grab the first and only element
>>> d[0]
array([[[ 1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.]],

       [[ 1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.]]])
# then you get the first element out of the two groups
>>> d[0][0]
array([[ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.]])
# thirdly, you get the two first elements as a list
>>> d[0][0][0:2]
array([[ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.]])
# finally, you get the first element of the list
>>> d[0][0][0:2][0]
array([ 1.,  1.,  1.,  1.])
 

Комментарии:

1. Я вижу, я становлюсь глупым. Я обнаружил, что то, что я хочу, — это d[0,0,0: 2,0] . Спасибо!

2. О, теперь я понимаю, чего ты хотел… Подробнее о срезах здесь: docs.python.org/2.3/whatsnew/section-slices.html

3. Возможно, вы также захотите использовать эту конструкцию массива, а не 1s … d = np.arange(1*2*3*4). изменить форму (1,2,3,4) … упрощает просмотр того, что вы возвращаете.