深入解析numpy.shape

发布时间:2023-05-20

一、shape的概念

numpy是一个广泛使用的Python科学计算库,该库可以帮助Python开发人员进行各种维度的数组计算。而shape就是numpy数组的一个属性,可以用来表示数组的“形状”,即数组每一维度的大小。numpy.shape返回的是一个元组,其中的每一个元素都表示数组在每一个维度上的大小。比如,(2,3)表示数组在第一维度上有2个元素,在第二维度上有3个元素。

import numpy as np
a = np.arange(15).reshape(3, 5)
print(a.shape)
# 输出(3,5)

在上面的代码中,首先创建了一个长度为15的一维数组,然后调用reshape方法将其变形成3行5列的矩阵,最后通过shape属性打印出了矩阵的形状。

二、numpy.shape和len的区别

numpy.shape和len都可以用来表示数组的长度,但是它们之间存在着一些重要的区别。len只能返回数组的第一个维度上的元素个数,而numpy.shape可以返回每一个维度上的元素个数。

b = np.array([[1, 2], [3, 4], [5, 6]])
print(len(b))  
# 输出3
print(b.shape)  
# 输出(3,2)

在上面的代码中,首先创建了一个二维数组b,然后使用len打印出了其第一个维度上的元素个数,即为3。同时,使用numpy.shape打印出了该数组在每一个维度上的元素个数。

三、numpy.shape的使用场景

numpy.shape具有广泛的使用场景,下面介绍一些常用的场景。

1. 矩阵转置

在numpy中,可以使用T属性将一个矩阵进行转置操作。而利用numpy.shape获取的元组便可以轻松地进行矩阵转置。

c = np.array([[1.,2.],[3.,4.]])
print(c)
# 输出[[1.,2.],[3.,4.]]
print(c.T)
# 输出[[1.,3.],[2.,4.]]
print(c.shape)
# 输出(2, 2)
print(c.T.shape)
# 输出(2, 2)

2. 矩阵相乘

在使用numpy进行矩阵运算时,需要确保两个矩阵的维度匹配。利用numpy.shape可以很方便地进行维度匹配。

d = np.array([[1, 2], [3, 4]])
e = np.array([[5, 6], [7, 8]])
print(np.dot(d, e))
# 输出[[19 22],[43 50]]
print(d.shape,e.shape)
# 输出(2, 2) (2, 2)

3. 图像处理

在进行图像处理时,利用numpy.shape可以很方便地获取图像的宽度和高度。

from PIL import Image
img = Image.open('test.jpg').convert('RGB')
img_arr = np.asarray(img)
print(img_arr.shape)
# 输出(400, 640, 3)

在上面的代码中,首先使用PIL库打开一张图片,并将其转换为RGB模式,然后使用numpy.asarray将其转换为numpy数组。最后,通过numpy.shape获取了图像的宽度、高度和通道数。

四、shape的小技巧

numpy.shape有一些小技巧可以帮助您更快地进行数组操作。

1. 一维数组

当使用numpy.shape操作一维数组时,可以将其转换为长度为1的元组。

f = np.array([1,2,3])
print(f.shape)
# 输出(3,)
print(f.reshape(1,-1).shape)
# 输出(1, 3)

2. 数组维度转换

当操作二维数组时,可以使用转置操作和reshape来改变数组的形状。

g = np.array([[1, 2], [3, 4]])
print(g.shape)
# 输出(2, 2)
g = g.T
print(g.shape)
# 输出(2, 2)
g = g.reshape((4, 1))
print(g.shape)
# 输出(4, 1)

在上面的代码中,首先创建了一个二维数组g,然后进行了转置操作和reshape操作,分别将其转换为了一个(2,2)大小和一个(4,1)大小的数组。

3. 数组形状的推测

当使用numpy.shape操作多维数组时,可以推测出数组的元素个数。

h = np.array([[[0, 1], [2, 3]], [[4, 5], [6, 7]]])
print(h.shape)
# 输出(2,2,2)
print(np.prod(h.shape))
# 输出8

在上面的代码中,首先创建了一个三维数组h。利用numpy.shape可以获取到数组在每一个维度上的大小为2,2,2。而通过numpy.prod函数可以很容易地得出该数组的元素个数,为8。