Любопытное (для меня) поведение с кусочками в массиве numpy - PullRequest
0 голосов
/ 08 июня 2018

Этот маленький код Python:

   >>> a=np.random.rand(3,4,5)
   >>> a[0][:][3]
   >>> a[0,:,3]

Создает результаты:

array([[[ 0.19080354,  0.45701919,  0.17411363,  0.45117827,  0.10413359],
            [ 0.86430848,  0.81831987,  0.27604238,  0.25587538,  0.72733844],
            [ 0.42065355,  0.63994284,  0.64540483,  0.55639512,  0.4455423 ],
            [ 0.04778727,  0.53506934,  0.79615599,  0.24200543,  0.82332594]],
           [[ 0.36535239,  0.5973006 ,  0.71075267,  0.16814739,  0.26409851],
            [ 0.85557313,  0.54190805,  0.65531428,  0.80448208,  0.54959253],
            [ 0.62112884,  0.9159606 ,  0.10186144,  0.14956198,  0.38026561],
            [ 0.70577261,  0.02682898,  0.04136858,  0.15603152,  0.47125989]],
           [[ 0.72864857,  0.09365008,  0.84137507,  0.43887926,  0.26616441],
            [ 0.31022073,  0.54251517,  0.30635049,  0.36270005,  0.85149399],
            [ 0.39371669,  0.38230285,  0.77115029,  0.22647156,  0.57128166],
            [ 0.54906932,  0.87058929,  0.72157733,  0.79480009,  0.033705  ]]])
array([ 0.04778727,  0.53506934,  0.79615599,  0.24200543,  0.82332594])
array([ 0.45117827,  0.25587538,  0.55639512,  0.24200543])

Почему две последние строки, a[0][:][3] и a[0,:,3], не возвращают один и тот же фрагментиз массива?Я ожидал, что они оба вернут то, что пришло от a[0,:,3].

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

a[0][:][3] говорит: взять 0-й (под) массив, третью строку и эквивалентен a[0][3]

a[0,:,3] говорит: взять 0-й (под) массив, все строки, третий элемент (столбец))

0 голосов
/ 08 июня 2018

Каждый [] оценивается интерпретатором Python отдельно, например,

In [117]: a=np.random.rand(3,4,5)
In [118]: a[0]
Out[118]: 
array([[0.98688694, 0.77224477, 0.19871568, 0.00552212, 0.81546143],
       [0.70685734, 0.72900717, 0.77127035, 0.07404465, 0.35846573],
       [0.11586906, 0.86310343, 0.62329813, 0.33089802, 0.06355835],
       [0.31098232, 0.32518332, 0.72960618, 0.63755747, 0.88721274]])
In [119]: _[:]
Out[119]: 
array([[0.98688694, 0.77224477, 0.19871568, 0.00552212, 0.81546143],
       [0.70685734, 0.72900717, 0.77127035, 0.07404465, 0.35846573],
       [0.11586906, 0.86310343, 0.62329813, 0.33089802, 0.06355835],
       [0.31098232, 0.32518332, 0.72960618, 0.63755747, 0.88721274]])
In [120]: _[3]
Out[120]: array([0.31098232, 0.32518332, 0.72960618, 0.63755747, 0.88721274])

Делая конечные фрагменты явными (для ясности нам, людям):

In [121]: a[0,:,:][:,:][3,:]
Out[121]: array([0.31098232, 0.32518332, 0.72960618, 0.63755747, 0.88721274])

Середина [:] не выбирает размер из оригинала a.Он работает с результатом a[0,:,:] и ничего не делает (кроме создания нового массива с той же формой и данными).Последний [3] не выбирает из третьего измерения a - он выбирает из первого измерения массива, полученного на шаге [:].Обратите внимание, что он возвращает массив shape (5,), размер последнего измерения a.a[0,3,:] производит то же самое.

Это, с другой стороны, полностью обрабатывается с помощью индексирования numpy и обрабатывает сразу все 3 измерения:

In [122]: a[0,:,3]
Out[122]: array([0.00552212, 0.07404465, 0.33089802, 0.63755747])

Возвращает форму (4,), средний размер a.a[0,:,:][:,3] производит то же самое.

Ключевым моментом является то, что numpy работает в интерпретаторе Python;это не меняет синтаксис Python.

0 голосов
/ 08 июня 2018

Это потому, что [:] не вносит никаких изменений в массив, поэтому a[0][:][3] совпадает с a[0][3], что равно a[0, 3, :]

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