使用Numpy是为了让数组的处理更高效,Numpy高效的原因在于操作并行,比如arrayX10的广播,不会一个一个去X10,而是一组一组的并行执行,numpy的实现涉及到硬件的管理;
另外,Numpy兼容性很好,接收一切可遍历对象
基本操作
import numpy as np
data=np.array([1,2,3,4,5])
print(data[::-1])
#[5 4 3 2 1]
arr=np.arange(6).reshape(3,2)
"""
array([[0, 1],
[2, 3],
[4, 5]])
"""
arr[1,1]
#等价于
arr[1][1]
#关于ndarray.reshape
arr=np.random.randn(6,3)
arr.reshape(-1,2)
#等价于arr.reshape([9,2])
#和arr.reshape((-1,2))
#arr.reshape([-1,2])
arr=np.empty((8, 4))
print(arr)
for i in range(8):
arr[i] = i
print(arr)
print(arr[[4,3]]) # 选择指定的行
arr = np.arange(32).reshape((8, 4)) # 重新调整数组形状
print(arr)
print(arr[[1, 5, 7, 2], [0, 3, 1, 2]]) # 实际选取的是[1, 0],[5, 3],[7, 1],[2, 2]
#等价于
print(np.array([arr[1,0],arr[5,3],arr[7,1],arr[2,2]]))
arr[1:4, 0:2]#左闭右开
"""
[[0. 0. 0. 0.]
[1. 1. 1. 1.]
[2. 2. 2. 2.]
[3. 3. 3. 3.]
[4. 4. 4. 4.]
[5. 5. 5. 5.]
[6. 6. 6. 6.]
[7. 7. 7. 7.]]
[[0. 0. 0. 0.]
[1. 1. 1. 1.]
[2. 2. 2. 2.]
[3. 3. 3. 3.]
[4. 4. 4. 4.]
[5. 5. 5. 5.]
[6. 6. 6. 6.]
[7. 7. 7. 7.]]
[[4. 4. 4. 4.]
[3. 3. 3. 3.]]
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]
[20 21 22 23]
[24 25 26 27]
[28 29 30 31]]
[ 4 23 29 10]
[ 4 23 29 10]
"""
# 快速数据检索
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = np.random.randn(7, 4)#生成标准正态分布
print(names)
print(data)
print(names == 'Bob') # 返回布尔数组
print(data[names == 'Bob']) # 布尔数组的值匹配每一行,True则选取,False则扔掉。
print(data[names == 'Bob', 2:]) # 切片:左闭右开
mask = (names == 'Bob') | (names == 'Will') # 条件混合,取或
print(data[mask])
data[names == 'Bob'] = -1 #广播赋值
print(data)
"""
['Bob' 'Joe' 'Will' 'Bob' 'Will' 'Joe' 'Joe']
[[-0.49658628 -0.18271861 0.14169803 0.19339167]
[ 0.21527264 0.61966656 -0.62114083 1.32643899]
[ 1.47913595 -0.69193664 0.38539048 -0.67995962]
[-1.23599738 1.02333909 0.55957597 -1.06472669]
[ 0.30070514 -0.91169445 -0.17996203 -1.25359602]
[ 0.6766203 0.28427213 -0.48749165 -0.01544164]
[-0.85773111 0.74483556 0.68253804 -0.01523486]]
[ True False False True False False False]
[[-0.49658628 -0.18271861 0.14169803 0.19339167]
[-1.23599738 1.02333909 0.55957597 -1.06472669]]
[[ 0.14169803 0.19339167]
[ 0.55957597 -1.06472669]]
[[-0.49658628 -0.18271861 0.14169803 0.19339167]
[ 1.47913595 -0.69193664 0.38539048 -0.67995962]
[-1.23599738 1.02333909 0.55957597 -1.06472669]
[ 0.30070514 -0.91169445 -0.17996203 -1.25359602]]
[[-1. -1. -1. -1. ]
[ 0.21527264 0.61966656 -0.62114083 1.32643899]
[ 1.47913595 -0.69193664 0.38539048 -0.67995962]
[-1. -1. -1. -1. ]
[ 0.30070514 -0.91169445 -0.17996203 -1.25359602]
[ 0.6766203 0.28427213 -0.48749165 -0.01544164]
[-0.85773111 0.74483556 0.68253804 -0.01523486]]
"""
关于axis
在对张量进行操作时,常常遇到axis问题,一定要用轴去思考,不能停留在习惯的行列,比如对于2维数组(2维张量):
axis=0,0轴沿着行轴的方向竖直操作;
axis=1,1轴沿着列轴的方向水平操作;
当维度上升,轴的操作顺序依次改变,实例如下:
"""
关于axis的解释(不要用行列去思考,应该用轴去思考张量)
对于2维张量:
axis=0,0轴沿着行轴的方向竖直操作
axis=1,1轴沿着列轴的方向水平操作
因此,axis应该沿着轴的方向进行操作
注意在np中,一维数组最好不要用行列的习惯去描述:
np.array([1,2,3,4])并不是1行4列
(4,)
np.array([[1,2,3,4],[5,6,7,8]])
(2,4)
"""
arr=np.arange(2*3*4*5).reshape((2,3,4,5))
print(arr)
"""
[[[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[ 10 11 12 13 14]
[ 15 16 17 18 19]]
[[ 20 21 22 23 24]
[ 25 26 27 28 29]
[ 30 31 32 33 34]
[ 35 36 37 38 39]]
[[ 40 41 42 43 44]
[ 45 46 47 48 49]
[ 50 51 52 53 54]
[ 55 56 57 58 59]]]
[[[ 60 61 62 63 64]
[ 65 66 67 68 69]
[ 70 71 72 73 74]
[ 75 76 77 78 79]]
[[ 80 81 82 83 84]
[ 85 86 87 88 89]
[ 90 91 92 93 94]
[ 95 96 97 98 99]]
[[100 101 102 103 104]
[105 106 107 108 109]
[110 111 112 113 114]
[115 116 117 118 119]]]]
"""
arr.sum(axis=0) # 3*4*5
arr.sum(axis=1) # 2*4*5
arr.sum(axis=2) # 2*3*5
arr.sum(axis=3) # 2*3*4
arr.sum(axis=-1) # 2*3*4
数据批量处理
# 数据批量处理
arr = np.random.randn(4, 4)#生成正态分布
print(arr)
print(np.where(arr > 0, 2, -2))#大于0就赋值2,小于0就赋值-2
"""
[[ 0.68372677 -1.86412642 0.58961852 0.32544047]
[ 0.79565194 1.03966075 -0.85851038 -0.14823294]
[-0.28363995 -0.68572107 -1.33090292 -3.45833198]
[-0.70958908 -1.23350697 -2.86709006 -1.42367267]]
[[ 2 -2 2 2]
[ 2 2 -2 -2]
[-2 -2 -2 -2]
[-2 -2 -2 -2]]
"""
线性代数
# 线性代数
x = np.array([[1., 2., 3.], [4., 5., 6.]])
y = np.array([[6., 23.], [-1, 7], [8, 9]])
print(x.dot(y)) # 矩阵乘法
from numpy.linalg import inv
x = np.random.randn(5, 5)
print(x.shape)
mat = x.T.dot(x)
mat_i = inv(mat) # inv求逆矩阵
print(mat_i)
print(mat.dot(mat_i)) # 单位矩阵,因为浮点数,所以非对角线元素为非0的非常小的数
"""
[[ 28. 64.]
[ 67. 181.]]
(5, 5)
[[ 0.82446643 0.54581153 -0.44799184 0.09960127 0.02026304]
[ 0.54581153 0.70515109 -0.30219266 -0.05083933 -0.12622845]
[-0.44799184 -0.30219266 0.53347673 -0.12813885 -0.09164157]
[ 0.09960127 -0.05083933 -0.12813885 1.67977712 0.76689927]
[ 0.02026304 -0.12622845 -0.09164157 0.76689927 0.5405451 ]]
[[ 1.00000000e+00 -3.10430063e-16 -4.57696449e-17 -1.12409918e-17
-5.28865495e-18]
[-2.34822720e-16 1.00000000e+00 -2.72756349e-17 -5.17134869e-17
3.40743463e-17]
[ 1.44682430e-16 -1.77238053e-16 1.00000000e+00 1.12559156e-17
-7.11535060e-18]
[-2.84987668e-18 -1.71613757e-16 -3.01336858e-18 1.00000000e+00
1.60616527e-16]
[-3.06454112e-17 3.69696345e-16 1.34722500e-17 -3.38788505e-16
1.00000000e+00]]
"""
统计
# NumPy的数学和统计方法
arr = np.random.randn(5, 4) # 正态分布的数据
print(arr)
print(arr.mean())
print(np.mean(arr))
print(arr.sum()) # 所有数字加起来
print(arr.mean(axis=1)) # 沿着列轴的水平方向操作
# 按正态分布生成随机数
samples = np.random.normal(size=(4, 4))
print(samples)
"""
[[-0.14999958 -0.19181591 -0.59152312 -1.17662015]
[-1.68578766 -1.57335795 -0.85423971 1.14586412]
[ 0.7520616 -1.56075608 -2.41920591 1.01697833]
[-0.40974949 1.35220199 0.56753759 1.00189374]
[ 0.91086938 -0.29062086 -0.43625747 0.37066491]]
-0.2110931109294083
-0.2110931109294083
-4.221862218588166
[-0.52748969 -0.7418803 -0.55273051 0.62797096 0.13866399]
[[-0.41304557 -0.68790345 0.23488014 -0.36097226]
[-1.09859999 0.84048153 0.67562553 1.96591442]
[-0.24425267 -0.34870918 0.09638551 -0.10508695]
[-0.78060261 0.99468715 0.79387488 0.09130019]]
"""
207

被折叠的 条评论
为什么被折叠?



