Индексирование массива 1D Numpy с использованием 2D-массива
В Numpy, можем ли мы использовать двумерный массив как индекс в одномерном массиве? Какое правило индексации массива массивов применяется к следующему коду?
# 1D array
arr = np.arange(10)
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 2D index
indx = np.array([[2, 4], [6, 8]])
# 2D index in 1D array
arr[indx]
# Output of above indexing is a 2D array!
array([[2, 4],[6, 8]])
1 ответ
Какое правило индексации массива массивов применяется к следующему коду?
Вот как работает расширенная индексация Numpy. Форма массива результатов связана с формой массива индекса, формой массива и осью, по которой вы передаете индекс. Вот несколько примеров, которые передают трехмерный массив в качестве индекса на первую ось массивов с различными формами.
In [47]: a.shape
Out[47]: (2, 5)
In [48]: b = a[np.array([[[0],[1]],[[1],[1]]])]
In [49]: b.shape
Out[49]: (2, 2, 1, 5)
In [50]: arr.shape
Out[50]: (3, 3, 3)
In [51]: b = arr[np.array([[[0],[1]],[[1],[1]]])]
In [52]: b.shape
Out[52]: (2, 2, 1, 3, 3)
И вот что вы получаете, когда передаете разные массивы на разные оси:
In [61]: b = arr[[[0],[2]],[[1],[0]]]
In [62]: b.shape
Out[62]: (2, 1, 3)
In [63]: arr.shape
Out[63]: (3, 3, 3)
Во всех этих индексах Numpy будет проверять несколько вещей, в первую очередь, он проверяет тип объектов, переданных в качестве индекса. Во-вторых, он сравнивает формы вашего индексного массива с формой соответствующей оси вашего массива. В-третьих, он проверяет, дает ли результат допустимый массив Numpy.
Вот еще несколько примеров:
In [64]: b = arr[[[[0],[2]]],[[1],[0]]]
In [65]: b.shape
Out[65]: (1, 2, 1, 3)
In [66]: b
Out[66]:
array([[[[ 3, 4, 5]],
[[18, 19, 20]]]])
In [67]: b = arr[[[[0],[2]]],[1],[0]]
In [68]: b
Out[68]:
array([[[ 3],
[21]]])
In [69]: b = arr[[[['a'],[2]]],[1],[0]]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-69-dba030ba9787> in <module>()
----> 1 b = arr[[[['a'],[2]]],[1],[0]]
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
In [70]: b = arr[[[[0],[2]]],[1],0]
In [71]: b = arr[[[[0],[2]]],[5],0]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-71-0962012e570a> in <module>()
----> 1 b = arr[[[[0],[2]]],[5],0]
IndexError: index 5 is out of bounds for axis 1 with size 3
In [72]:
In [72]: b = arr[[[[0],[[2]]]],[5],0]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-72-9a520b0cb30e> in <module>()
----> 1 b = arr[[[[0],[[2]]]],[5],0]
ValueError: setting an array element with a sequence.
In [73]: b = arr[[[[0],[[2]]]],[5],[0]]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-73-67187db6f452> in <module>()
----> 1 b = arr[[[[0],[[2]]]],[5],[0]]
ValueError: setting an array element with a sequence.