2016-11-13 3 views
5

Работает через sliding-window пример для numpy. Пытается понять ,None из start_idx = np.arange(B[0])[:,None]numpy index slice with None

foo = np.arange(10) 
print foo 
print foo[:] 
print foo[:,] 
print foo[:,None] 

Эффект None, кажется, транспонировать массив.

[0 1 2 3 4 5 6 7 8 9] 
[0 1 2 3 4 5 6 7 8 9] 
[0 1 2 3 4 5 6 7 8 9] 
[[0] 
[1] 
[2] 
[3] 
[4] 
[5] 
[6] 
[7] 
[8] 
[9]] 

Но я не совсем уверен. Я не смог найти документацию, которая объясняет, что делает второй параметр (None). Это тоже тяжелый фрагмент для Google. numpy array docs makes me think it has something to do with advanced indexing, но я не уверен.

+1

Он используется в качестве псевдонима для [ 'np.newaxis'] (https: //docs.scipy.org/doc/numpy/reference/arrays.indexing.html # numpy.newaxis), который используется для добавления размеров синглтона (dims with length = 1). В случае с образцом он был добавлен для преобразования входного массива 1D в '2D', при этом второй dim был одноточечным. – Divakar

ответ

11

foo[:, None] расширяет 1 мерную матрицу foo во втором измерении. Фактически, numpy использует псевдоним np.newaxis для этого.

считают foo

foo = np.array([1, 2]) 
print(foo) 

[1 2] 

одномерный массив имеет ограничения. Например, что такое транспонирование?

print(foo.T) 

[1 2] 

То же самое, как и сам

print(foo.T == foo) 

[ True True] 

Это ограничение массива имеет много значений, и он становится полезным рассмотреть foo в контексте более высокой размерности. NumPy использует np.newaxis

print(foo[np.newaxis, :]) 

[[1 2]] 

Но это np.newaxis просто синтаксический сахар для None

np.newaxis is None 

True 

Так, часто мы используем None вместо потому что меньше символов и означает то же самое

print(foo[None, :]) 

[[1 2]] 

Хорошо, посмотрим, что еще мы могли бы сделать. Заметьте, что я использовал пример с None в первой позиции, в то время как OP использует вторую позицию. Эта позиция определяет, какое измерение расширено. И мы могли бы это сделать дальше. Пусть эти примеры помогают объяснить

print(foo[None, :]) # same as foo.reshape(1, 2) 

[[1 2]] 

print(foo[:, None]) # same as foo.reshape(2, 1) 

[[1] 
[2]] 

print(foo[None, None, :]) # same as foo.reshape(1, 1, 2) 

[[[1 2]]] 

print(foo[None, :, None]) # same as foo.reshape(1, 2, 1) 

[[[1] 
    [2]]] 

print(foo[:, None, None]) # same as foo.reshape(2, 1, 1) 

[[[1]] 

[[2]]] 

Имейте в виду, какой размер есть что, когда NumPy печатает массив

print(np.arange(27).reshape(3, 3, 3)) 

      dim2   
      ────────⇀ 
dim0 → [[[ 0 1 2] │ dim1 
      [ 3 4 5] │ 
      [ 6 7 8]] ↓ 
      ────────⇀ 
    → [[ 9 10 11] │ 
      [12 13 14] │ 
      [15 16 17]] ↓ 
      ────────⇀ 
    → [[18 19 20] │ 
      [21 22 23] │ 
      [24 25 26]]] ↓