python之numpy学习笔记

一、概念:
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

			一个强大的N维数组对象 ndarray
			广播功能函数
			整合 C/C++/Fortran 代码的工具
			线性代数、傅里叶变换、随机数生成等功能

二、代码详解
1.数组属性
np.array是numpy定义数组的语句

属性 说明
ndattay.ndim 秩,即轴的数量或维度的数量
ndattay.shape 数组的维度,对于矩阵,n行n列
ndattay.size 数组元素的总个数,相当于shape中的n* m的值
ndattay.dtype ndarray对象的元素类型
import numpy as np

array = np.array([[1,2,3],[4,5,6]])   #定义矩阵
print(array)
print("number of dim:",array.ndim )     # 维度
print('shape:', array.shape)            # 形状,几行几列
print('size:',array.size)               # 元素个数

结果:

[[1 2 3]
 [4 5 6]]
number of dim: 2
shape: (2, 3)
size: 6

2.创建array
np.array([2,25,4],dtype=np.float32)
创建array时,加dtype属性可以定义数据的类型
numpy 的数值类型实际上是 dtype 对象的实例,并对应唯一的字符,包括 np.bool_,np.int32,np.float32,等等。

aa = np.array([2,25,4],dtype=np.float32)          # dtype 定义数据类型
print(aa.dtype)

结果:

float32

定义矩阵

a = np.array([[1,56,2],                            # 定义矩阵
              [4,5,6]])
print(a)

结果:

[[ 1 56  2]
 [ 4  5  6]]

定义全零的矩阵

b = np.zeros((3,4))                        # 全零的矩阵
print(b)

结果:

[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

定义全1的矩阵

c = np.ones((3,4),dtype=np.int16)          # 全1的矩阵
print(c)

结果:

[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]]

定义空的矩阵

什么都没有的矩阵,其实它的值接近于0

d = np.empty((3,4))          # 什么都没有的矩阵,各项值近似于零
print(d)

结果;

[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

定义列表

定义从10到20,步数为2的列表,并且reshape可以重新定义矩阵的形状

e = np.arange(10,20,2)         # 定义从10到20,步数为2的列表
print(e)
f = np.arange(12).reshape((3,4))    # reshape 重新定义矩阵的形状 行和列
print(f)

结果:

[10 12 14 16 18]

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

定义段长
定义段长,和arange很相似,只是把第三个参数步长改成分割成多少个部分,也就是这一组数据的个数。
通过reshape可以改变形状。

g = np.linspace(1,10,5)            # 定义段长 和arange相似,但是第三个参数指定的是
                                    # 多少段,也就是多少个数,
print(g)

h = np.linspace(1,10,6).reshape((2,3))   # 可以更改形状
print(h)

结果:

[ 1.    3.25  5.5   7.75 10.  ]

[[ 1.   2.8  4.6]
 [ 6.4  8.2 10. ]]

3.基础运算
对于矩阵也有加、减、乘、除法运算。
矩阵之间的加减法和普通的运算一样,这里不再赘述。直接上代码。

加、减,单个数相乘法

a = np.array([10,20,30,40])
b = np.arange(4)
print(a,b)
c = a-b                     # array 加法
d  = b**2                # 单个数乘法
print(c)
print(d)

结果:

[10 20 30 40] [0 1 2 3]

[10 19 28 37]

[0 1 4 9]

矩阵相乘

用.dot表示矩阵相乘

a = np.array([[1,1],
              [0,1]])
b = b.reshape((2,2))
print(a)
print(b)
c= a*b      # 逐个元素相乘
c_dot = np.dot(a,b)   # 矩阵运算
c_dot_2 = a.dot(b)    # 同上
print(c)
print(c_dot)

结果;

[[1 1]
 [0 1]]
 
[[0 1]
 [2 3]]
 
[[0 1]
 [0 3]]
 
[[2 4]
 [2 3]]

numpy还自带sin、cos、tan等函数

e = 10*np.sin(a)            # np自带sin,cos,tan函数
print(e)

结果:

[-5.44021111  9.12945251 -9.88031624  7.4511316 ]

axis、sum、min、max

axis=0时,进行列操作,当axis=1时,进行行操作。
在这里插入图片描述

f = np.random.random((2,4))
print(f)
print(np.sum(f,axis=0))      # 当axis = 0时,进行列操作
                            # 当axis = 1时,进行行操作
print(np.min(f,axis=1))
print(np.max(f))

结果:

[[0.59017978 0.81785528 0.1870801  0.32297439]
 [0.88120557 0.15484577 0.45264645 0.54394487]]
 
[1.47138535 0.97270106 0.63972654 0.86691925]

[0.1870801  0.15484577]

0.8812055728408469

接了下来用一串代码描述以下内容:

属性 说明
np.argmin (A) 最小值的索引
np.argmax (A) 最大值的索引
np.mean(A) 平均值(还可以写成A.mean())
npaverage(A) 平均值
np.median(A) 中位数
np.cumsum(A) 累加
np.diff(A) 逐差
np.nonzero(A) 非零的数,输出行数和列数
np.sort(A) 逐行排序
np.transpose(A) 转置
A.T 转置
np.clip(A,5,9) 滤波,所有大于9的数变成0所有小于5的数变成5
np.mean(A,axis=0) 每一列求平均值

代码详情:

import numpy as np

A = np.arange(2,14).reshape((3,4))

print(np.argmin(A))       # 最小值的索引
print(A)
print(np.argmax(A))        # 最大值索引
print(np.mean(A))          # 平均值
print(A.mean())

print(np.average(A))   # 平均值

print(np.median(A))  #中位数
print(np.cumsum(A))   # 累加

print(np.diff(A))  # 逐差
print(np.nonzero(A))  # 非零的数 输出行数和列数

print(np.sort(A))    # 逐行排序
print(np.transpose(A))    # 转置
print(A.T)            # 转置
print((A.T).dot(A))
print(np.clip(A,5,9))    #所有大于9的数变成9所有小于5的数变成5
print(np.mean(A,axis=0))

结果:

0

[[ 2  3  4  5]
 [ 6  7  8  9]
 [10 11 12 13]]
 
11

7.5

7.5

7.5

7.5

[ 2  5  9 14 20 27 35 44 54 65 77 90]

[[1 1 1]
 [1 1 1]
 [1 1 1]]
 
(array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))

[[ 2  3  4  5]
 [ 6  7  8  9]
 [10 11 12 13]]
 
[[ 2  6 10]
 [ 3  7 11]
 [ 4  8 12]
 [ 5  9 13]]
 
[[ 2  6 10]
 [ 3  7 11]
 [ 4  8 12]
 [ 5  9 13]]
 
[[140 158 176 194]
 [158 179 200 221]
 [176 200 224 248]
 [194 221 248 275]]
 
[[5 5 5 5]
 [6 7 8 9]
 [9 9 9 9]]
 
[6. 7. 8. 9.]

4.索引
array索引从0开始
利用切片形式进行索引
flatten()方法降维,使得所有数据排成一个列表。
A.flat也是降维,但必须用一个迭代器才能输出所有值
代码;

import numpy as np

A = np.arange(3,15).reshape((3,4))
print(A)
print(A[2][1])              # 索引 从0开始
print(A[2,1])
print(A[:,1])
print(A[1,1:3])        # 类似于切片

for row in A:           # 迭代每一行
    print(row)

for column in A.T:          # 迭代每一列
    print(column)

print(A.flatten())         # 降维一行
for item in A.flat:
    print(item)

结果;

[[ 3  4  5  6]
 [ 7  8  9 10]
 [11 12 13 14]]
 
12

12

[ 4  8 12]
[8 9]

[3 4 5 6]
[ 7  8  9 10]
[11 12 13 14]

[ 3  7 11]
[ 4  8 12]
[ 5  9 13]
[ 6 10 14]

[ 3  4  5  6  7  8  9 10 11 12 13 14]

3
4
5
6
7
8
9
10
11
12
13
14

6.array合并
主要有三个方法 垂直叠加,水平叠加,concatenate

垂直相加

import numpy as np

A = np.array([1,1,1])
B = np.array([2,2,2])
C =np.vstack((A,B))
print(np.vstack((A,B)))      # vertical stack  垂直叠加
print(A.shape,C.shape)

结果;

[[1 1 1]
 [2 2 2]]
 
(3,) (2, 3)

水平叠加

D = np.hstack((A,B))  # horizontal stack    水平叠加
print(D)
print(A.shape,D.shape)

结果:

[1 1 1 2 2 2]
(3,) (6,)

np.newaxis 加一个维度
np.concatenate(_,axis=) 进行行合并或者列合并由axis控制 0代表垂直相加,1代表水平相加
代码:

A = np.array([1,1,1])[:,np.newaxis]   # 给列方向加一个维度  变成(3,1)
B = np.array([2,2,2])[:,np.newaxis]
print(np.hstack((A,B)))
C = np.concatenate((A,B,B,A),axis=1)    #横向合并 和hstack和vstack相似
print(C)

结果:

[[1 2]
 [1 2]
 [1 2]]
 
[[1 2 2 1]
 [1 2 2 1]
 [1 2 2 1]]

7.array分割
split切块的应用,axis=1时,垂直分割成块,axis=0时,水平分割成块。
array_split()不能够等分的时候用这个
vsplit():垂直分割
hsplit():水平分割
应用看代码;

import numpy as np

A = np.arange(12).reshape((3,4))
print(A)

print(np.split(A,2,axis=1))    # 将A垂直分割成两块
print(np.split(A,3,axis=0))    # 将A水平分割成两块
print(np.split(A,[1,3],axis=1)) # 分成1 2 1   中间列表[1,3] 可以解释为索引小于1为第一块,1到
                                # 3之间为第二块   大于3为第三块
print(np.split(A,[1,2,3],axis=1))    # 分成 1 1 1 1
print(np.array_split(A,3,axis=1))  # 不等分
print(np.vsplit(A,3))    # 垂直分割
print(np.hsplit(A,2))    # 水平分割

结果;

[[ 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]])]

[array([[0],
       [4],
       [8]]), array([[ 1,  2],
       [ 5,  6],
       [ 9, 10]]), array([[ 3],
       [ 7],
       [11]])]
       
[array([[0],
       [4],
       [8]]), array([[1],
       [5],
       [9]]), array([[ 2],
       [ 6],
       [10]]), array([[ 3],
       [ 7],
       [11]])]
       
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2],
       [ 6],
       [10]]), array([[ 3],
       [ 7],
       [11]])]
       
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]

[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11]])]

8.numpy的复制
copy的应用。
由于建立一个数组或者矩阵后,a = np.arange(4),令b = a ,c = a,d = b 这时候改变a,b,c,d任何一个,其他三个都会变化,这是因为,内存中只有一个 np.arange(4),a,b,c,d是物理内容的索引,更改一个之后,也就是更改了物理内容,那么其他索引指向的内容也会变化。
若不想其他三个变化,则要使用copy()这个方法,将重新开辟内存存放物理内容。

import numpy as np

a = np.arange(4)
b = a
c = a
d = b
a[0] = 11
print('a',a)                # 浅度copy
print('b',b)
print('c',c)
print('d',d)
d[1:3] = [22,33]
print('a',a)
print('b',b)
print('c',c)
print('d',d)

b= a.copy()
a[3] =44
print('a',a)
print('b',b)

结果;

a [11  1  2  3]
b [11  1  2  3]
c [11  1  2  3]
d [11  1  2  3]
#更改d的内容后:
a [11 22 33  3]
b [11 22 33  3]
c [11 22 33  3]
d [11 22 33  3]
#copy方法的应用,更改a的值后a,b的对比
a [11 22 33 44]
b [11 22 33  3]

(未完待续,日后学习后继续补充)

猜你喜欢

转载自blog.csdn.net/Prince_IT/article/details/91356621