附录2:Numpy实例记录

使用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]]
"""
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值