NumPy是Python的一个常用科学计算库,它是Numerical Python的缩写。它的核心是一个多维数组对象(ndarray),这个对象是一个快速而灵活的容器,可以用于大量数据集和矩阵计算。
ndarray是NumPy中最重要的数据结构,它是多维数组(n-dimensional array)的缩写。在numpy中,所有的数据都以ndarray的形式存储和处理。
ndarray有以下几个重要的属性:
shape:表示数组的形状,即每个维度的大小。例如,一个形状为(3, 4)的ndarray表示一个3行4列的矩阵。
dtype:表示数组的数据类型。例如,一个dtype为int32的ndarray表示每个元素都是32位整数。
ndim:表示数组的维度,即数组的秩。例如,一个维度为2的ndarray表示一个二维数组。
ndarray中的每个元素都必须是相同的数据类型,并且在内存中是连续存储的,这使得NumPy能够非常高效地处理大规模的数据。
可以使用NumPy中的array函数来创建数组。
import numpy as np
# 创建一维数组
a = np.array([1, 2, 3])
print(a.ndim, a.shape, a.dtype)
print(a)
# 创建二维数组
b = np.array([[1, 2, 3], [4, 5, 6]])
print(b.ndim, b.shape, b.dtype)
print(b)
# 创建不同数据类型的数组
a1 = np.array([-1, 0, 1], dtype=int)
a2 = np.array([-1, 0, 1], dtype=float)
a3 = np.array([-1, 0, 1], dtype=bool)
print(a1.dtype, a2.dtype, a3.dtype)
print(a1)
print(a2)
print(a3)
输出内容:
1 (3,) int32
[1 2 3]
2 (2, 3) int32
[[1 2 3]
[4 5 6]]
int32 float64 bool
[-1 0 1]
[-1. 0. 1.]
[ True False True]
可以使用zeros
、ones
、empty
等函数来创建特定形状的数组。
# 生成元素全为0的数组
a1 = np.zeros((2,3), dtype=float)
a2 = np.zeros((2,3), dtype=int)
a3 = np.zeros((2,3), dtype=bool)
print(a1)
print(a2)
print(a3)
# 生成元素全为1的数组
b1 = np.ones((2,4), dtype=float)
b2 = np.ones((2,4), dtype=int)
b3 = np.ones((2,4), dtype=bool)
print(b1)
print(b2)
print(b3)
# 生成元素为随机数的数组
c1 = np.empty((2,5), dtype=float)
c2 = np.empty((2,5), dtype=int)
c3 = np.empty((2,5), dtype=bool)
print(c1)
print(c2)
print(c3)
输出内容:
[[0. 0. 0.]
[0. 0. 0.]]
[[0 0 0]
[0 0 0]]
[[False False False]
[False False False]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[1 1 1 1]
[1 1 1 1]]
[[ True True True True]
[ True True True True]]
[[1.93101617e-312 1.44295714e-312 1.59149684e-312 6.57818695e-313
1.90979621e-312]
[8.48798317e-313 8.48798319e-314 1.06099790e-313 1.69759664e-313
4.88059032e-313]]
[[93 75 23 23 93]
[ 8 40 83 93 59]]
[[ True True True True True]
[ True True True True True]]
NumPy中提供了一些方法,可以用来生成固定范围的数组:
# 生成起始值1、终止值100、步长10的数组
a = np.arange(1, 100, 10)
print(a)
# 生成起始值1、终止值100、样本数10个的数组
b = np.linspace(1, 100, 10)
print(b)
# 生成起始值1、终止值2、以10为对数底数、样本数9个的数组
c = np.logspace(1.0, 2.0, num=9)
print(c)
输出内容:
[ 1 11 21 31 41 51 61 71 81 91]
[ 1. 12. 23. 34. 45. 56. 67. 78. 89. 100.]
[ 10. 13.33521432 17.7827941 23.71373706 31.6227766
42.16965034 56.23413252 74.98942093 100. ]
NumPy中的random模块提供了各种随机数生成函数,例如rand()、randn()、randint()等,可以生成各种不同类型的随机数,这些随机数在模拟、实验和数据分析等任务中都非常有用。
np.random.rand(d0, d1, …, dn):生成[0,1)之间均匀分布的随机数,参数为生成的数组的维度。
np.random.random_sample(size=None):与rand()函数相同,生成[0,1)之间均匀分布的随机数。
np.random.random(size=None):与random_sample()函数相同,生成在[0, 1)范围内的均匀分布随机数。
np.random.randn(d0, d1, …, dn):生成标准正态分布(均值为0,标准差为1)的随机数,参数为生成的数组的维度。
# 生成[0,1)之间均匀分布的随机数
a1 = np.random.rand(20)
a2 = np.random.rand(2, 20)
print(a1)
print(a2)
# 生成[0,1)之间均匀分布的随机数
b = np.random.random_sample(20)
print(b)
# 生成[0,1)之间均匀分布的随机数
c = np.random.random(20)
print(c)
# 生成标准正态分布(均值为0,标准差为1)的随机数
d = np.random.randn(20)
print(d)
import matplotlib.pyplot as plt
# 数据可视化
figure, ax = plt.subplots(2, 2)
plt.subplot(2, 2, 1)
plt.hist(np.random.rand(2000))
plt.subplot(2, 2, 2)
plt.hist(np.random.random_sample(2000))
plt.subplot(2, 2, 3)
plt.hist(np.random.random(2000))
plt.subplot(2, 2, 4)
plt.hist(np.random.randn(2000))
plt.show()
np.random.randint(low, high=None, size=None, dtype=‘l’):生成low和high之间的整数,包括low,但不包括high。若high参数没有给出,则生成[0, low)之间的整数。size参数为生成的数组的维度,dtype为所生成整数的数据类型。
np.random.choice(a, size=None, replace=True, p=None):从给定的一维数组a中生成随机样本,size参数为生成的数组的维度,replace参数指定是否可以重复采样,p参数为给定的一维数组a中每个元素被选择的概率。
np.random.shuffle(x):将给定的序列随机打乱。
# 生成low和high之间的整数,包括low,但不包括high
a1 = np.random.randint(1, 100)
a2 = np.random.randint(1, 100, 20)
print(a1)
print(a2)
# 从给定的一维数组a中生成随机样本
b1 = np.random.choice(a2)
b2 = np.random.choice(a2, 10)
print(b1)
print(b2)
# 将给定的序列随机打乱
np.random.shuffle(a2)
print(a2)
NumPy提供了各种数据类型转换函数,可以将数组从一种数据类型转换成另一种数据类型,例如astype()函数可以将数组的数据类型转换成指定的数据类型,这些函数在数据预处理和清洗中经常使用。
# 创建一个浮点数类型的数组
a = np.array([-1, 0, 1], dtype=float)
print(a)
# 将浮点数转换成整数
b = a.astype(int)
print(b)
# 将整数转换成布尔值
c = a.astype(bool)
print(c)
NumPy提供了丰富的数组操作、数学函数、线性代数、随机数生成等功能,为科学计算和数据分析提供了强大的支持。以上列出的仅仅是一些常见的操作,还有更多更强大的功能我们下次继续探索。