import numpy as np
ndarray 多维数组
- Array数组创建函数
# np.array()
arr_1 = np.array([[1,2,3],[5,6,7]])
type(arr_1)
numpy.ndarray
arr_1.shape
(2, 3)
arr_1.dtype
dtype('int32')
arr_2 = np.array([[1,2,3],[5,6,7]],dtype = np.float32)
arr_2.dtype
dtype('float32')
# 更改array的数据类型,.astype(np.)
arr_3 = arr_2.astype(np.int32)
arr_3.dtype
dtype('int32')
# np.zeros(),全0数组
np.zeros(6)
array([0., 0., 0., 0., 0., 0.])
np.zeros((3,4))
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
# np.ones(),全1数组
np.ones(6)
array([1., 1., 1., 1., 1., 1.])
np.ones((3,4))
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
# np.empty() 只分配内容控件不填充任何值
np.empty((2,3,3))
array([[[1.04246130e-297, 1.69121096e-306, 1.29061074e-306],
[1.69119873e-306, 1.78019082e-306, 8.34441742e-308],
[1.78022342e-306, 6.23058028e-307, 9.79107872e-307]],
[[6.89807188e-307, 7.56594375e-307, 6.23060065e-307],
[1.78021527e-306, 8.34454050e-308, 1.11261027e-306],
[1.15706896e-306, 1.33512173e-306, 3.49698923e-317]]])
# np.arange(),类似内置的range,返回的是Array数组
np.arange(12).reshape(3,4)
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
# np.eye(),单位矩阵
np.eye(6)
array([[1., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0.],
[0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 1.]])
数组运算
- 算术运算
arr = np.arange(12).reshape(3,4)
arr
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
arr+arr
array([[ 0, 2, 4, 6],
[ 8, 10, 12, 14],
[16, 18, 20, 22]])
arr*arr
array([[ 0, 1, 4, 9],
[ 16, 25, 36, 49],
[ 64, 81, 100, 121]])
- 索引
- 切片
arr[0]
arr[:3]
arr[-1]
array([ 8, 9, 10, 11])
arr[1,2]
6
arr[1][2]
6
arr[1,2] = 66
arr
array([[ 0, 1, 2, 3],
[ 4, 5, 66, 7],
[ 8, 9, 10, 11]])
# 转置
arr.T
array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 66, 10],
[ 3, 7, 11]])
布尔型数组
names = np.array(['Bob','Joe','Will'])
date = np.arange(1,10,4)
names == 'Bob'
array([ True, False, False])
date
array([1, 5, 9])
date[names == 'Bob']
array([1])
date[~(names == 'Bob')]
array([5, 9])
date[names != 'Bob']
array([5, 9])
date[date>=5]
array([5, 9])
多个布尔条件 算术运算
- 且 &
- 或 |
key = (names == 'Bob' ) | (date<3)
key
array([ True, False, False])
key = (names == 'Bob' ) & (date<3)
key
array([ True, False, False])
通用函数 – ufunc
arr = np.arange(10)
np.sqrt(arr) # 计算各个元素的平方根
array([0. , 1. , 1.41421356, 1.73205081, 2. ,
2.23606798, 2.44948974, 2.64575131, 2.82842712, 3. ])
np.exp(arr) # 计算各个元素的指数e^x
array([1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01,
5.45981500e+01, 1.48413159e+02, 4.03428793e+02, 1.09663316e+03,
2.98095799e+03, 8.10308393e+03])
x = np.random.randn(8)
x
array([ 1.54492539, 1.23743264, -0.43177947, -0.62904697, -0.49509432,
1.37267661, 0.45616824, 0.69478241])
y = np.random.randn(8)
y
array([ 1.41358016, 1.71561102, 0.30880553, 2.34460093, 0.31110363,
2.00262837, 0.89447709, -0.61136333])
np.rint(x) # 各个元素四舍五入到最近的整数,保留dtype
array([ 2., 1., -0., -1., -0., 1., 0., 1.])
np.isnan(x) # 判断哪些元素是NaN
array([False, False, False, False, False, False, False, False])
- 二元 ufunc
更多通用函数 取numpy官网查询
np.add(x,y)# 将数组中对应元素相加
array([ 2.95850554, 2.95304366, -0.12297395, 1.71555397, -0.18399068,
3.37530498, 1.35064533, 0.08341909])
np.minimum(x,y)# 元素级最小值计算
array([ 1.41358016, 1.23743264, -0.43177947, -0.62904697, -0.49509432,
1.37267661, 0.45616824, -0.61136333])
np.fmin(x,y)# 元素级最小值计算,忽略NaN
array([ 1.41358016, 1.23743264, -0.43177947, -0.62904697, -0.49509432,
1.37267661, 0.45616824, -0.61136333])
np.maximum(x,y)# 元素级最大值计算
array([1.54492539, 1.71561102, 0.30880553, 2.34460093, 0.31110363,
2.00262837, 0.89447709, 0.69478241])
np.fmax(x,y)# 元素级最大值计算,忽略NaN
array([1.54492539, 1.71561102, 0.30880553, 2.34460093, 0.31110363,
2.00262837, 0.89447709, 0.69478241])
统计
arr = np.random.randn(3,4)
arr
array([[-0.26664427, -1.60844846, -0.59910976, 0.2213661 ],
[ 2.11733409, 1.35787167, 1.03795679, 0.68043033],
[-0.18726122, -0.18600493, -0.56661837, 1.72816168]])
arr.mean() # 均值
0.3107528023087508
arr.mean(1) # axis = 1,求每行的均值
array([-0.5632091 , 1.29839822, 0.19706929])
arr.mean(0) #axis = 0,求每列的均值
array([ 0.5544762 , -0.14552724, -0.04259045, 0.8766527 ])
arr.sum() #求和
3.7290336277050096
arr.sum(1)
array([-2.2528364 , 5.19359287, 0.78827716])
arr.sum(0)
array([ 1.66342859, -0.43658172, -0.12777135, 2.6299581 ])
arr = np.arange(12).reshape(3,4)
arr
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
arr.cumsum() # 元素累加
array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66], dtype=int32)
arr.cumsum(1)# 元素行累加
array([[ 0, 1, 3, 6],
[ 4, 9, 15, 22],
[ 8, 17, 27, 38]], dtype=int32)
arr.cumsum(0)
array([[ 0, 1, 2, 3],
[ 4, 6, 8, 10],
[12, 15, 18, 21]], dtype=int32)
arr.cumprod()# 元素累积
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32)
arr.std() # 标准差, 有axis操作
3.452052529534663
arr.std(0)
array([3.26598632, 3.26598632, 3.26598632, 3.26598632])
arr.var() # 方差
11.916666666666666
np.argmin(arr)# 最小元素的索引
0
np.argmax(arr) # 最大元素的索引
11
np.max(arr)
11
np.min(arr)
0
arr = np.random.randn(100)
# 布尔型数组
(arr > 0).sum()
54
排序
arr = np.random.randn(6)
arr
array([ 1.04535439, 0.46594185, 0.7804373 , 1.56907968, -0.78065019,
0.58804597])
arr.sort()
arr
array([-0.78065019, 0.46594185, 0.58804597, 0.7804373 , 1.04535439,
1.56907968])
- 多维数组
arr = np.random.randn(3,4)
arr
array([[-1.37985941, 0.65325469, -0.28817527, -0.02299107],
[ 0.4429337 , 3.51252763, -1.02962186, 1.45001376],
[-1.42937016, -0.65463081, -0.09767723, -0.49224928]])
arr.sort() # 有axis轴
arr
array([[-1.37985941, -0.28817527, -0.02299107, 0.65325469],
[-1.02962186, 0.4429337 , 1.45001376, 3.51252763],
[-1.42937016, -0.65463081, -0.49224928, -0.09767723]])
去重
arr = np.random.randint(2,5,5)
arr
array([4, 4, 2, 4, 2])
np.unique(arr)
array([2, 4])
arr = np.random.randint(3,6,12).reshape(3,4)
arr
array([[4, 4, 4, 4],
[5, 5, 3, 3],
[4, 4, 3, 3]])
np.unique(arr)
array([3, 4, 5])
数组的集合运算
x = np.random.randint(2,6,10)
x
array([5, 2, 3, 4, 4, 3, 4, 5, 5, 2])
y = np.random.randint(3,7,10)
y
array([5, 4, 6, 3, 4, 4, 4, 6, 6, 6])
np.intersect1d(x,y) #求公共元素,交集
array([3, 4, 5])
np.union1d(x,y) # 求并集
array([2, 3, 4, 5, 6])
np.setdiff1d(x,y)# 集合的差
array([2])
np.setxor1d(x,y) # 求异或
array([2, 6])
Numpy输入输出
arr = np.random.randn(6)
np.save('demo',arr)# 以未压缩的原始二进制格式保存在扩展名为.npy的文件中
np.load('demo.npy')# 读取磁盘上的数组
arr
array([ 0.32358355, 0.91039905, 1.40027705, 1.2007988 , 0.56437337,
-1.37940863])
x = np.random.randn(6)
y = np.random.randn(8)
np.savez('demo.npz',a = x,b = y)# 保存多个数组到一个压缩文件中
arch = np.load('demo.npz')
arch['b']
array([-0.73327216, 0.64236622, 0.47694044, -0.76341329, 1.10744661,
3.01207849, -2.31595105, 0.02843877])
- 文本文件
z = np.random.randn(6)
np.savetxt('demo.txt',z)
a =np.loadtxt('demo.txt',delimiter = ',')
a
array([ 1.87221781, -1.19406744, -0.43478245, -0.69413357, 1.81840891,
0.87762923])
点乘(矩阵乘法) – 线性代数函数
- np.dot
- x.T.dot(x),x.dot(y)
x = np.arange(1,13).reshape(3,4)
x
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
x.T.dot(x)
array([[107, 122, 137, 152],
[122, 140, 158, 176],
[137, 158, 179, 200],
[152, 176, 200, 224]])
x*x# 数组乘法
array([[ 1, 4, 9, 16],
[ 25, 36, 49, 64],
[ 81, 100, 121, 144]])