Python numpy 数组的形状

Python numpy 模块有一个 shape 函数,它可以帮助我们找到数组或矩阵的大小。除了这个 shape 函数,Python numpy 模块还有 reshape、resize、transpose、swapaxes、flatten、ravel 和 squeeze 函数来改变数组的矩阵到所需的大小。

Python numpy 数组的形状

numpy 模块有一个重要的属性叫做 shape,这个属性用来获取或查找它的形状。

import numpy as np
 
arr = np.array([10, 20, 30, 40, 50, 60, 70, 80])
print(arr)
 
print(np.shape(arr))
[10 20 30 40 50 60 70 80]
(8,)

让我再举一个 Python numpy 数组形状的例子。这里,我们使用了不同大小的数组,然后使用这个属性找到了它们的形状。

import numpy as np
 
x = np.array([[10, 20, 30], [40, 50, 60]])
print(x)
print('x = ', np.shape(x))
print()
 
arr = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
print(arr)
print('arr = ', np.shape(arr))
 
arr1 = np.random.randint(5, 50, size = (5, 8))
print('\n-----Two Dimensional Random----')
print(arr1)
print('arr1 = ', np.shape(arr1))
 
arr2 = np.array([[[ 7, 24, 24, 22], [24, 10, 16,  2], [ 1, 16, 7, 16]],
                 [[22, 23, 12, 39], [16, 30, 37, 15],[16, 17,  3, 19]]])
print('\n-----Three Dimensional----')
print(arr2)
print('arr2 = ', np.shape(arr2))
[[10 20 30]
 [40 50 60]]
x =  (2, 3)

[[1 2]
 [3 4]
 [5 6]
 [7 8]]
arr =  (4, 2)

-----Two Dimensional Random----
[[15 41 15 28 34 39 29 38]
 [12 39 22 37 32 15 40 17]
 [48 18 23 41 43 21 10 12]
 [33 49  9 18 31 38 24 28]
 [10 46 46 10 41 37 40 21]]
arr1 =  (5, 8)

-----Three Dimensional----
[[[ 7 24 24 22]
  [24 10 16  2]
  [ 1 16  7 16]]

 [[22 23 12 39]
  [16 30 37 15]
  [16 17  3 19]]]
arr2 =  (2, 3, 4)

数组重塑

这个 numpy Array shape 函数接受一个数组作为第一个参数,形状或矩阵大小作为第二个参数。

import numpy as np
 
arr = np.array([[10, 20, 30], [40, 50, 60]])
print(arr)
print('arr = ', np.shape(arr))
 
print('\n---New---')
new_arr = np.reshape(arr, (6,))
print(new_arr)
print('new_arr = ', np.shape(new_arr))

输出

[[10 20 30]
 [40 50 60]]
arr =  (2, 3)

---New---
[10 20 30 40 50 60]
new_arr =  (6,)

这是 reshape 函数的另一个例子。在这里,我们使用了一个一维数组,并将其重塑为不同的维度。供您参考,我们正在使用 Python Numpy 数组函数来返回重塑后的形状。

import numpy as np
 
arr = np.array([10, 20, 30, 40, 50, 60, 70, 80])
print(arr)
print(np.shape(arr))
 
print('\n---New ---')
new_arr = np.reshape(arr, (2,4))
print(new_arr)
print(np.shape(new_arr))
 
print('\n---New ---')
new_arr1 = np.reshape(arr, (4, 2))
print(new_arr1)
print(np.shape(new_arr1))
 
print('\n---New ---')
new_arr2 = np.reshape(arr, (8,1))
print(new_arr2)
print(np.shape(new_arr2))
[10 20 30 40 50 60 70 80]
(8,)

---New ---
[[10 20 30 40]
 [50 60 70 80]]
(2, 4)

---New ---
[[10 20]
 [30 40]
 [50 60]
 [70 80]]
(4, 2)

---New ---
[[10]
 [20]
 [30]
 [40]
 [50]
 [60]
 [70]
 [80]]
(8, 1)

如果你不知道或不想使用第二个值,那么你可以赋值为 -1。reshape 函数会自动选择大小并将其替换为 -1。

import numpy as np
 
arr = np.array([[10, 20, 30, 40, 50, 60, 70, 80]])
print(arr)
print('Array Shape = ', np.shape(arr))
 
print('\n---New ---')
new_arr = np.reshape(arr, (2,-1))
print(new_arr)
print(np.shape(new_arr))
 
print('\n---New ---')
new_arr1 = np.reshape(arr, (4, -1))
print(new_arr1)
print(np.shape(new_arr1))
[[10 20 30 40 50 60 70 80]]
Array Shape =  (1, 8)

---New ---
[[10 20 30 40]
 [50 60 70 80]]
(2, 4)

---New ---
[[10 20]
 [30 40]
 [50 60]
 [70 80]]
(4, 2)

使用 resize 改变 Python numpy 数组的形状

resize 函数可用于将现有的 numpy 数组调整为所需的形状。此函数接受一个数组作为第一个参数,以及所需的形状大小作为第二个参数。如果您指定的所需形状大于原始形状,则 Numpy 数组的 resize 函数会复制基本数组中的值以创建一个大数组。

import numpy as np
 
arr = np.array([1, 2, 3])
print(arr)
 
print('\n---New ---')
new_arr = np.resize(arr, (4, 3))
print(new_arr)
 
print('\n---New ---')
new_arr1 = np.resize(arr, (9, 8))
print(new_arr1)

resize 函数改变形状的输出

[1 2 3]

---New ---
[[1 2 3]
 [1 2 3]
 [1 2 3]
 [1 2 3]]

---New ---
[[1 2 3 1 2 3 1 2]
 [3 1 2 3 1 2 3 1]
 [2 3 1 2 3 1 2 3]
 [1 2 3 1 2 3 1 2]
 [3 1 2 3 1 2 3 1]
 [2 3 1 2 3 1 2 3]
 [1 2 3 1 2 3 1 2]
 [3 1 2 3 1 2 3 1]
 [2 3 1 2 3 1 2 3]]

让我们看看当我们将 Python 数组调整为较小的大小时会发生什么。

import numpy as np
 
arr = np.array([1, 2, 3, 4, 5])
print('---Original Array---')
print(arr)
 
print('\n---New Array---')
new_arr = np.resize(arr, (1, 3))
print(new_arr)
 
print('\n---New Array---')
new_arr1 = np.resize(arr, (4, 1))
print(new_arr1)
Python Numpy Array shape resize Example

如何使用 transpose 改变 Python numpy 数组的形状?

transpose 函数可以帮助您转置给定的矩阵或二维数组。

import numpy as np
 
arr = np.random.randint(5, 50, size = (5, 8))
print('\n-----Two Dimensional Random ----')
print(arr)
 
print('\n-----Transposed Two Dimensional ----')
print(np.transpose(arr))

使用 transpose 函数改变形状的输出


-----Two Dimensional Random----
[[11 28 30 26  8 39 26 46]
 [16 22 27  9 25 16 17 10]
 [20 42 14 36 31 22 43 10]
 [41 35 25 13 36 33 18 23]
 [21 46 42 39 48  9 21 44]]

-----Transposed Two Dimensional----
[[11 16 20 41 21]
 [28 22 42 35 46]
 [30 27 14 25 42]
 [26  9 36 13 39]
 [ 8 25 31 36 48]
 [39 16 22 33  9]
 [26 17 43 18 21]
 [46 10 10 23 44]]

使用 transpose 改变 Python numpy 三维数组的形状

让我使用这个 transpose 函数来转置一个 3D 数组

import numpy as np
 
arr2 = np.random.randint(1, 20, size = (2, 3, 4))
print('\n-----Three Dimensional Random ----')
print(arr2)

print('\n-----Transposed Three Dimensional ----')
print(np.transpose(arr2))

通过转置三维数组改变形状的输出


-----Three Dimensional Random ----
[[[ 5 11  8  7]
  [17 14 12 14]
  [19 16  1 17]]

 [[ 1 13 12 10]
  [18  3  5 18]
  [ 6  1 12 10]]]

-----Transposed Three Dimensional ----
[[[ 5  1]
  [17 18]
  [19  6]]

 [[11 13]
  [14  3]
  [16  1]]

 [[ 8 12]
  [12  5]
  [ 1 12]]

 [[ 7 10]
  [14 18]
  [17 10]]]

使用 swapaxes 改变 Python numpy 数组的形状

swapaxes 函数用于交换数组给定的两个轴。它接受三个参数——名称、first_axis 和 second_axis。接下来,numpy swapaxes 函数交换 first_axis 和 second_axis。

import numpy as np
 
arr1 = np.array([[10, 20, 30, 40]])
print(arr1)
print('swapaxes Result of arr1')
print(np.swapaxes(arr1, 0, 1))
 
arr2 = np.array([[10, 20, 30], [40, 50, 60]])
print(arr2)
print('swapaxes Result of arr2')
print(np.swapaxes(arr2, 0, 1))
 
arr3 = np.array([[[10, 20], [30, 40], [50, 60]]])
print('swapaxes Result of arr3')
print(np.swapaxes(arr3, 0, 1))
 
print('swapaxes Result of arr3 - 0, 2')
print(np.swapaxes(arr3, 0, 2))
 
print('swapaxes Result of arr3 - 2, 1')
print(np.swapaxes(arr3, 2, 1))

swapaxes 输出

[[10 20 30 40]]
swapaxes Result of arr1
[[10]
 [20]
 [30]
 [40]]
[[10 20 30]
 [40 50 60]]
swapaxes Result of arr2
[[10 40]
 [20 50]
 [30 60]]
swapaxes Result of arr3
[[[10 20]]

 [[30 40]]

 [[50 60]]]
swapaxes Result of arr3 - 0, 2
[[[10]
  [30]
  [50]]

 [[20]
  [40]
  [60]]]
swapaxes Result of arr3 - 2, 1
[[[10 30 50]
  [20 40 60]]]

这次,我们在由 randint 函数生成的三维随机数组上使用了这个 Python swapaxes 函数。

import numpy as np
 
arr3 = np.random.randint(1, 40, size = (2, 3, 4))
print(arr3)
print('swapaxes Result of arr3, 0, 1')
print(np.swapaxes(arr3, 0, 1))
 
print('swapaxes Result of arr3, 0, 2')
print(np.swapaxes(arr3, 0, 2))
 
print('swapaxes Result of arr3, 2, 1')
print(np.swapaxes(arr3, 2, 1))

swapaxes 函数输出

[[[22 38 11 37]
  [33 33 37 30]
  [37 29 17 13]]

 [[26 17  8 35]
  [38 28 28 32]
  [ 7 38 15 26]]]
swapaxes Result of arr3, 0, 1
[[[22 38 11 37]
  [26 17  8 35]]

 [[33 33 37 30]
  [38 28 28 32]]

 [[37 29 17 13]
  [ 7 38 15 26]]]
swapaxes Result of arr3, 0, 2
[[[22 26]
  [33 38]
  [37  7]]

 [[38 17]
  [33 28]
  [29 38]]

 [[11  8]
  [37 28]
  [17 15]]

 [[37 35]
  [30 32]
  [13 26]]]
swapaxes Result of arr3, 2, 1
[[[22 33 37]
  [38 33 29]
  [11 37 17]
  [37 30 13]]

 [[26 38  7]
  [17 28 38]
  [ 8 28 15]
  [35 32 26]]]

使用 flatten 改变 Python numpy 数组的形状

flatten 函数将给定的数组折叠成一维数组。这个 Numpy 数组的 flatten 函数接受 order 参数来决定扁平化项目的顺序。

order = {C, F, A, K} – 您可以使用其中一个,或者它会认为是 C,因为它是默认值。C 表示项目将按行主序扁平化。F 表示 Fortran 风格或列主序。如果数组是 Fortran 连续的,A 将按列主序扁平化,否则按行主序。K 将按元素在内存中出现的顺序扁平化。

import numpy as np
 
arr = np.array([[1, 2, 3], [4, 5, 6]])
print('flatten Result of arr Order C = ', arr.flatten())
print('flatten Result of arr Order F = ', arr.flatten('F'))
print('flatten Result of arr Order A = ', arr.flatten('A'))
print('flatten Result of arr Order K = ', arr.flatten('K'))
 
arr1 = np.array([[10, 20], [30, 40], [50, 60], [70, 80]])
print('\nflatten Result of arr1 Order C')
print(arr1.flatten())
 
print('\nflatten Result of arr1 = F')
print(arr1.flatten('F'))
 
print('\nflatten Result of arr1 = A')
print(arr1.flatten('A'))
 
print('\nflatten Result of arr1  = K')
print(arr1.flatten('K'))

使用 flatten 函数的输出

flatten Result of arr Order C =  [1 2 3 4 5 6]
flatten Result of arr Order F =  [1 4 2 5 3 6]
flatten Result of arr Order A =  [1 2 3 4 5 6]
flatten Result of arr Order K =  [1 2 3 4 5 6]

flatten Result of arr1 Order C
[10 20 30 40 50 60 70 80]

flatten Result of arr1 = F
[10 30 50 70 20 40 60 80]

flatten Result of arr1 = A
[10 20 30 40 50 60 70 80]

flatten Result of arr1 = K
[10 20 30 40 50 60 70 80]

这次,我们使用 randint 函数生成了一个 随机 三维整数数组。接下来,我们使用这个 Python Numpy flatten 函数将其扁平化为一维数组。

import numpy as np
 
arr2 = np.random.randint(1, 40, size = (2, 3, 4))
print(arr2)
print('flatten Result of arr2')
print(arr2.flatten())
 
print('\nflatten Result of arr2 = F')
print(arr2.flatten('F'))
 
print('\nflatten Result of arr2 = A')
print(arr2.flatten('A'))
 
print('\nflatten Result of arr2 = K')
print(arr2.flatten('K'))

flatten 函数用于扁平化或改变形状的输出

[[[38 14 31 31]
  [14 16 34 21]
  [ 6 11 37 33]]

 [[11 17  7 33]
  [31 34 30 28]
  [36 14 39  8]]]
flatten Result of arr2
[38 14 31 31 14 16 34 21  6 11 37 33 11 17  7 33 31 34 30 28 36 14 39  8]

flatten Result of arr2 = F
[38 11 14 31  6 36 14 17 16 34 11 14 31  7 34 30 37 39 31 33 21 28 33  8]

flatten Result of arr2 = A
[38 14 31 31 14 16 34 21  6 11 37 33 11 17  7 33 31 34 30 28 36 14 39  8]

flatten Result of arr2 = K
[38 14 31 31 14 16 34 21  6 11 37 33 11 17  7 33 31 34 30 28 36 14 39  8]

使用 ravel 改变 Python numpy 数组的形状

ravel 函数返回一个连续的扁平一维数组。这个 Python Numpy ravel 函数的语法是

numpy.ravel(name, order = {C, F, A, K})

此 ravel 函数接受 order 参数以决定扁平化项目的顺序。C 表示行主序中的项目索引。F 表示 Fortran 风格或列主序中的索引项目。如果它是 Fortran 连续的,A 按列主序读取索引,否则按行主序。K 按元素在内存中出现的顺序读取索引。

import numpy as np
 
arr = np.array([[1, 2, 3], [4, 5, 6]])
print('arr ravel Result of Order C = ', np.ravel(arr))
print('arr ravel Result of Order F = ', np.ravel(arr, order = 'F'))
print('arr ravel Result of Order A = ', np.ravel(arr, order = 'A'))
print('arr ravel Result of Order K = ', np.ravel(arr, order = 'K'))
 
arr1 = np.array([[11, 20], [33, 40], [55, 60], [77, 80]])
print('\narr1 ravel Result of Order C = ', np.ravel(arr1))
print('arr1 ravel Result of Order F = ', np.ravel(arr1, order = 'F'))
print('arr1 ravel Result of Order A = ', np.ravel(arr1, order = 'A'))
print('arr1 ravel Result of Order K = ', np.ravel(arr1, order = 'K'))

ravel 函数用于形状数组的输出

arr ravel Result of Order C =  [1 2 3 4 5 6]
arr ravel Result of Order F =  [1 4 2 5 3 6]
arr ravel Result of Order A =  [1 2 3 4 5 6]
arr ravel Result of Order K =  [1 2 3 4 5 6]

arr1 ravel Result of Order C =  [11 20 33 40 55 60 77 80]
arr1 ravel Result of Order F =  [11 33 55 77 20 40 60 80]
arr1 ravel Result of Order A =  [11 20 33 40 55 60 77 80]
arr1 ravel Result of Order K =  [11 20 33 40 55 60 77 80]

在这个例子中,我们使用 Python randint 函数声明了一个三维随机整数数组。接下来,我们使用这个 ravel 函数将这个随机数组扁平化为一个连续的一维数组。

import numpy as np
 
arr = np.random.randint(1, 40, size = (2, 3, 4))
print(arr)
 
print('\narr ravel Result of Order C')
print(np.ravel(arr))
 
print('arr ravel Result of Order F')
print(np.ravel(arr, order = 'F'))
 
print('arr ravel Result of Order A')
print(np.ravel(arr, order = 'A'))
 
print('arr ravel Result of Order K')
print(np.ravel(arr, order = 'K'))
 
print('\nTransposed arr ravel Result of Order C')
print(np.ravel(arr.T))

ravel 函数输出

[[[ 7  9 22 11]
  [ 4  8 11 35]
  [ 3 34 28  5]]

 [[28 18 18 15]
  [14 37  8 23]
  [35 35 13 23]]]

arr ravel Result of Order C
[ 7  9 22 11  4  8 11 35  3 34 28  5 28 18 18 15 14 37  8 23 35 35 13 23]
arr ravel Result of Order F
[ 7 28  4 14  3 35  9 18  8 37 34 35 22 18 11  8 28 13 11 15 35 23  5 23]
arr ravel Result of Order A
[ 7  9 22 11  4  8 11 35  3 34 28  5 28 18 18 15 14 37  8 23 35 35 13 23]
arr ravel Result of Order K
[ 7  9 22 11  4  8 11 35  3 34 28  5 28 18 18 15 14 37  8 23 35 35 13 23]

Transposed arr ravel Result of Order C
[ 7 28  4 14  3 35  9 18  8 37 34 35 22 18 11  8 28 13 11 15 35 23  5 23]

使用 squeeze 改变 numpy 数组的形状

squeeze 函数从给定形状中删除单维条目。这个 squeeze 函数的语法是

numpy.squeeze(array_name, axis = {None, 0, 1, 2 ..}).
import numpy as np
 
arr = np.arange(12).reshape(1, 3, 4)
print(arr)
print('\narr squeeze Result')
 
a = np.squeeze(arr)
print(a)
print('a = ', arr.shape, a.shape)
 
b = np.squeeze(arr, axis = 0)
print(b)
print('b = ', arr.shape, b.shape)
 
arr1 = np.array([[[[11, 20], [33, 40], [55, 60], [77, 80]]]])
x = np.squeeze(arr1)
print(x)
print('x = ', arr1.shape, x.shape)
 
y = np.squeeze(arr1, axis = 1)
print(y)
print('y = ', arr1.shape, y.shape)

squeeze 函数输出

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

arr squeeze Result
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
a =  (1, 3, 4) (3, 4)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
b =  (1, 3, 4) (3, 4)
[[11 20]
 [33 40]
 [55 60]
 [77 80]]
x =  (1, 1, 4, 2) (4, 2)
[[[11 20]
  [33 40]
  [55 60]
  [77 80]]]
y =  (1, 1, 4, 2) (1, 4, 2)