Fork me on GitHub

Numpy入门学习笔记

根据莫凡Python学习numpy的笔记。

In [1]:
# Demo Intro
import numpy as np

array = np.array([[1,2,3], [2,3,4]])
print(array)
print('\ndimension:', array.ndim)
print('shape:    ', array.shape)
print('size:     ', array.size)
[[1 2 3]
 [2 3 4]]

dimension: 2
shape:     (2, 3)
size:      6

numpy的几种属性:

  • ndim: 维度
  • shape: 行数和列数
  • size: 元素个数

numpy创建array

关键字:

  • array: 创建数组
  • dtype: 指定数据类型
  • zeros: 创建数据全为0
  • ones: 创建数据全为1
  • empty: 创建数据接近0
  • arange: 按指定范围创建数据
  • linspace: 创建线段
In [2]:
import numpy as np

# 创建数组+指定数据类型
np.array([2,3,4], dtype=np.int32)
Out[2]:
array([2, 3, 4], dtype=int32)
In [3]:
np.array([[1,2,3], [2,3,4]])
Out[3]:
array([[1, 2, 3],
       [2, 3, 4]])
In [4]:
# 3行3列的0矩阵,元素类型为整型
np.zeros((3,4), dtype=np.int)
Out[4]:
array([[0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0]])
In [5]:
# 3行4列的全一矩阵,默认数据类型为float
np.ones((3,4))
Out[5]:
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])
In [8]:
# 3×3的矩阵,每个元素都接近0
np.set_printoptions(threshold=np.nan) # 可以打印长的浮点数
np.empty((3,3))
Out[8]:
array([[6.90490256e-310, 2.45199721e-316, 5.39494389e-317],
       [5.39495970e-317, 6.90490020e-310, 6.90490015e-310],
       [6.90490178e-310, 6.90490256e-310, 6.90488251e-310]])
In [26]:
# arrage(start,stop,step)生成连续数组(列向量)
print(np.arange(10,20,2))  # 5行1列
print(np.arange(10,20,2).shape)
[10 12 14 16 18]
(5,)
In [11]:
# 使用reshape改变形状
np.arange(12).reshape((3,4))
Out[11]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
In [14]:
# 使用linspace(start, stop, seg_num)创建线段型数据
np.linspace(1,10,20)  # 1-10分割成20个数据
Out[14]:
array([ 1.        ,  1.47368421,  1.94736842,  2.42105263,  2.89473684,
        3.36842105,  3.84210526,  4.31578947,  4.78947368,  5.26315789,
        5.73684211,  6.21052632,  6.68421053,  7.15789474,  7.63157895,
        8.10526316,  8.57894737,  9.05263158,  9.52631579, 10.        ])
In [17]:
np.linspace(1,10,20).reshape((5,4))
Out[17]:
array([[ 1.        ,  1.47368421,  1.94736842,  2.42105263],
       [ 2.89473684,  3.36842105,  3.84210526,  4.31578947],
       [ 4.78947368,  5.26315789,  5.73684211,  6.21052632],
       [ 6.68421053,  7.15789474,  7.63157895,  8.10526316],
       [ 8.57894737,  9.05263158,  9.52631579, 10.        ]])

numpy基础运算

对应位置的元素计算(矩阵shape相同或第一个操作数是一个数):

  • + 加法
  • - 减法
  • * 乘法
  • \ 除法
  • ** 乘方
In [54]:
import numpy as np

a = np.linspace(1,16,16,dtype=np.int).reshape((4,4))
b = np.ones((4,4), dtype=np.int)
print('a:\n',a,'\nb:\n',b,'\n\n')
# 对应元素计算
print('a+b:\n', a+b)
print('a-b:\n', a-b)
print('a*a:\n', a*a)
print('b/a:\n', b/a) #需注意除数为0的情况
print('a^3:\n', a**3)
print('10倍数乘:\n', 10*a)
print('sin(a):\n', np.sin(a))
a:
 [[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]
 [13 14 15 16]] 
b:
 [[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]] 


a+b:
 [[ 2  3  4  5]
 [ 6  7  8  9]
 [10 11 12 13]
 [14 15 16 17]]
a-b:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
a*a:
 [[  1   4   9  16]
 [ 25  36  49  64]
 [ 81 100 121 144]
 [169 196 225 256]]
b/a:
 [[1.         0.5        0.33333333 0.25      ]
 [0.2        0.16666667 0.14285714 0.125     ]
 [0.11111111 0.1        0.09090909 0.08333333]
 [0.07692308 0.07142857 0.06666667 0.0625    ]]
a^3:
 [[   1    8   27   64]
 [ 125  216  343  512]
 [ 729 1000 1331 1728]
 [2197 2744 3375 4096]]
10倍数乘:
 [[ 10  20  30  40]
 [ 50  60  70  80]
 [ 90 100 110 120]
 [130 140 150 160]]
sin(a):
 [[ 0.84147098  0.90929743  0.14112001 -0.7568025 ]
 [-0.95892427 -0.2794155   0.6569866   0.98935825]
 [ 0.41211849 -0.54402111 -0.99999021 -0.53657292]
 [ 0.42016704  0.99060736  0.65028784 -0.28790332]]
In [57]:
# 对矩阵元素逻辑判断
print(a <= 10)
[[ True  True  True  True]
 [ True  True  True  True]
 [ True  True False False]
 [False False False False]]
In [87]:
# 进行矩阵的乘法:.dot()
print(a.dot(b))
print('\nanother usage:\n')
print(np.dot(a,b))
[[10 10 10 10]
 [26 26 26 26]
 [42 42 42 42]
 [58 58 58 58]]

another usage:

[[10 10 10 10]
 [26 26 26 26]
 [42 42 42 42]
 [58 58 58 58]]
In [72]:
# sum(),max(),min()的使用
randarray = np.random.random((2,4))
print(randarray)
print('\nsum:',np.sum(randarray))
print('max:', np.max(randarray))
print('min:', np.min(randarray))

# 对行或列进行sum(),max(),min()运算
# axis=1  行运算;axis=0  列运算
print('\nmax of col:', np.max(randarray, axis=0))
print('\nmin of row:', np.min(randarray, axis=1))
[[0.44809699 0.75635426 0.81882632 0.3101331 ]
 [0.37378018 0.16058239 0.12850341 0.02132567]]

sum: 3.0176023185725045
max: 0.8188263160593351
min: 0.021325665734493682

max of col: [0.44809699 0.75635426 0.81882632 0.3101331 ]

min of row: [0.3101331  0.02132567]
In [82]:
# 矩阵基本计算2
# 矩阵这种内置的函数还有很多,需要时候再查文档
import numpy as np
A = np.arange(2,14).reshape((3,4)) 

# array([[ 2, 3, 4, 5]
#        [ 6, 7, 8, 9]
#        [10,11,12,13]])

         
print('A的最小索引:', np.argmin(A))    
print('A的最大索引:', np.argmax(A))    

print('\nA所有元素的均值:', np.mean(A))     
print('A所有元素的均值:', np.average(A))
print('A所有元素的均值:', A.mean())

print('A所有元素的中位数:', np.median(A))
A的最小索引: 0
A的最大索引: 11

A所有元素的均值: 7.5
A所有元素的均值: 7.5
A所有元素的均值: 7.5
A所有元素的中位数: 7.5

numpy索引

类似数组的索引

In [88]:
# 一维矩阵索引
import numpy as np
A = np.arange(3,15)
print(A[1])
4
In [91]:
# 二维矩阵索引
A = np.arange(3,15).reshape((3,4))
"""
array([[ 3,  4,  5,  6]
       [ 7,  8,  9, 10]
       [11, 12, 13, 14]])
"""
         
print(A[2])   
print(A[1][1])
print(A[1][:2])
[11 12 13 14]
8
[7 8]
In [94]:
# 逐行打印/逐列打印矩阵
for row in A:
    print(row)
print('-'*10)
for col in A.T:  # A.T为转置矩阵
    print(col)
[3 4 5 6]
[ 7  8  9 10]
[11 12 13 14]
----------
[ 3  7 11]
[ 4  8 12]
[ 5  9 13]
[ 6 10 14]
In [96]:
# 迭代矩阵中所有元素
import numpy as np
A = np.arange(3,7).reshape((2,2))
# flatten()将矩阵元素展开为一行数列       
print(A.flatten())   
# flat是一个迭代器,可以迭代矩阵中所有元素
for item in A.flat:
    print(item)
[3 4 5 6]
3
4
5
6

numpy array合并

  • np.vstack() 上下合并
  • np.hstack() 左右合并
  • np.newaxis() 向量转换为矩阵
  • np.concatenate() 多个矩阵合并
In [111]:
import numpy as np
A = np.array([1,1,1])  # 列向量
B = np.array([2,2,2])

print(np.vstack((A,B))) 
print('-'*10)
print(np.hstack((A,B)))
[[1 1 1]
 [2 2 2]]
----------
[1 1 1 2 2 2]
In [ ]:
# 将向量转换为矩阵
print(A[np.newaxis,:])
# [[1 1 1]]

print(A[np.newaxis,:].shape)
# (1,3)

print(A[:,np.newaxis])
"""
[[1]
[1]
[1]]
"""

print(A[:,np.newaxis].shape)
# (3,1)
In [116]:
# concatenate合并多个array
# axis=0为列方向(vertical)
C = np.concatenate((A,B,B,A),axis=0)
# D = np.concatenate((A,B,B,A),axis=1)
# axis=1时AxisError: axis 1 is out of bounds for array of dimension 1
# 是因为1d array does not have a 2nd axis
print(C)
[1 1 1 2 2 2 2 2 2 1 1 1]

numpy array 分割

  • 纵向分割
  • 横向分割
  • 错误的分割
  • 不等量的分割
In [119]:
import numpy as np
A = np.arange(12).reshape((3, 4))
print(A)
print('-'*10,'\n沿横向分割:\n')
print(np.split(A, 2, axis=1))
print('-'*10,'\n沿纵向分割:\n')
print(np.split(A, 3, axis=0))
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
---------- 
沿横向分割:

[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11]])]
---------- 
沿纵向分割:

[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
In [121]:
# 不等量分割array_split()
print(np.array_split(A, 3, axis=1))
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2],
       [ 6],
       [10]]), array([[ 3],
       [ 7],
       [11]])]

numpy copy&deep; copy

Python里的shadow copy和deep copy的概念:

  • shadow copy只是复制了引用
  • deep copy是完全复制成了另一个对象

numpy对象中:

  • =是shadow copy
  • copy()方法是deep copy
In [129]:
# shadow copy
import numpy as np

a = np.arange(4)

b = a

a[0] = 11
print(a)
print(b)
print(b is a)
# a,b实质上指向同一个对象
[11  1  2  3]
[11  1  2  3]
True
In [130]:
# deep copy
import numpy as np

a = np.arange(4)

b = a.copy()

a[0] = 10
print(a)
print(b)
print(b is a)
[10  1  2  3]
[0 1 2 3]
False

Comments