Ключевое отличие содержится в документации для np.stack
(выделено мной):
Присоединение к последовательности массивов вдоль оси new .
Рассмотрим следующие массивы:
arr1=np.array([[1,2,3],[7,8,9]])
arr2=np.array([[4,5,6],[10,11,12]])
arr3=np.array([['a','b','c'],['d','e','f']])
[[1 2 3]
[7 8 9]]
[[ 4 5 6]
[10 11 12]]
[['a' 'b' 'c']
['d' 'e' 'f']]
Затем рассмотрим следующие результаты:
#stack horizontally on existing axis
np.hstack([arr1,arr2,arr3])
array([['1', '2', '3', '4', '5', '6', 'a', 'b', 'c'],
['7', '8', '9', '10', '11', '12', 'd', 'e', 'f']], dtype='<U11')
shape: (2, 9)
#stack vertically on existing axis
np.vstack([arr1,arr2,arr3])
array([['1', '2', '3'],
['7', '8', '9'],
['4', '5', '6'],
['10', '11', '12'],
['a', 'b', 'c'],
['d', 'e', 'f']], dtype='<U11')
shape: (6, 3)
#stack depth-wise, adding an axis 2
np.dstack([arr1,arr2,arr3])
array([[['1', '4', 'a'],
['2', '5', 'b'],
['3', '6', 'c']],
[['7', '10', 'd'],
['8', '11', 'e'],
['9', '12', 'f']]], dtype='<U11')
shape: (2, 3, 3)
Обратите внимание, что во всех случаях, кроме dstack
, два массива объединяются по существующему ось (ось 0, ось 1 и dstack добавляет новую ось 2)
Затем, в свете приведенных выше результатов, что, если мы используем stack
вместо этого, изменяя только ось стека?
for i in [0,1,2]:
stacked=np.stack([arr1,arr2,arr3],axis=i)
print(f'Stacked on axis {i}\n',stacked, '\n',f'array shape:{stacked.shape}','\n')
Stacked on axis 0
[[['1' '2' '3']
['7' '8' '9']]
[['4' '5' '6']
['10' '11' '12']]
[['a' 'b' 'c']
['d' 'e' 'f']]]
array shape:(3, 2, 3)
Stacked on axis 1
[[['1' '2' '3']
['4' '5' '6']
['a' 'b' 'c']]
[['7' '8' '9']
['10' '11' '12']
['d' 'e' 'f']]]
array shape:(2, 3, 3)
Stacked on axis 2
[[['1' '4' 'a']
['2' '5' 'b']
['3' '6' 'c']]
[['7' '10' 'd']
['8' '11' 'e']
['9' '12' 'f']]]
array shape:(2, 3, 3)
Обратите внимание, что это все трехмерные массивы, только порядок элементов изменяется в зависимости от направления, в котором они расположены