以下代码用的是jupyter notebook 编译
有些代码是连续的 所以就没有完全打进去
有些print省略
1. array(数组)
import numpy as np
a = np.array([[1,2,3],[2,3,4]])
a
输出:
array([[1, 2, 3],
[2, 3, 4]])
"number of dimension",array.ndim
"shape:",array.shape
"size",array.size
输出:
('number of dimension', 2)
('shape:', (2, 3))
('size', 6)
1、array.ndim 数组轴的个数,在python的世界中,轴的个数被称作秩,
2、’shape 数组的维度。这是一个指示数组在每个维度上大小的整数元组。例如一个n排m列的矩阵,它的shape属性将是(2,3),这个元组的长度显然是秩,即维度或者ndim属性
3、数组元素的总个数,等于shape属性中元组元素的乘积。
a = np.arange(10,20,2)
a
>>>输出:
array([10, 12, 14, 16, 18])
2、dtype zeros
import numpy as np
a = np.array([2,23,4],dtype=np.int)
a.dtype
>>>输出:
dtype('int32')
3、empty
import numpy as np
array = np.array([[1,2,3],[2,3,4],[2,3,4],[2,3,4]])
print(array)
array = np.empty((3,4))
print(array)
array([[1, 2, 3],
[2, 3, 4],
[2, 3, 4],
[2, 3, 4]])
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
4、reshape()
#arange不包含最后 reshape重新定义长和宽
a = np.arange(12).reshape((3,4))
print(a)
>>>输出:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
a = np.linspace(1,10,20).reshape((4,5))
#1-10 步长是20 #这里的4x5要和前面的一致,不然会乱码
print(a)
>>>输出
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. ]])
2.numpy基础运算1
2.1加减乘除&sin
import numpy as np
# 减法
a = np.array([10,20,30,40])
b = np.arange(4)
print((a,b))
>>>输出:
(array([10, 20, 30, 40]), array([0, 1, 2, 3]))
c=a-b
print(c)
>>>输出
[10 19 28 37]
c=a+b
print(c)
>>>输出
[10 19 28 37]
c=b**2 #suqare
print(c)
>>>输出
[10 21 32 43]
c = 10*np.sin(a) #矩阵是弧度,弧度变角度 pai/180 再sin
print (c)
>>>输出
[0 1 4 9]
2.2 大于小于
print(b)
输出:array([0, 1, 2, 3])
b<3
输出:array([ True, True, True, False])
2.3点乘* & 矩阵乘dot
2.3.1 点乘
各元素按位相乘
print(a)
print(b)
>>>输出:
array([[4, 1],
[7, 1]])
array([[0, 1],
[2, 3]])
c= a * b
print(c)
array([[ 0, 1],
[14, 3]])
2.3.2 矩阵乘
要求w的行数要等于x的列数
print(a)
print(b)
>>>输出:
array([[4, 1],
[7, 1]])
array([[0, 1],
[2, 3]])
print(c_dot)
>>>输出:
array([[ 2, 7],
[ 2, 10]])
2.4随机数random()
a = np.random.random((2,4))
#numpy里面的random包下的random方法
#0到1取随机数,跟matlab里面的random一样,2x4的矩阵
print(a)
>>>输出
[[0.87844318 0.49784507 0.25121893 0.31187728]
[0.46214256 0.79918406 0.46349321 0.62381245]]
2.5 统计
2.5.1求和sum()
print(np.sum(a))
#求和
>>>输出
4.288016743405327
2.5.2最小值min()
print(np.min(a))
print(np.argmin(a))
#最小值
0.2512189255163222
2.5.3最大值max()
print(np.max(a))
print(np.argmax(a))
#最大值
0.8784431813031204
2.5.4平均值mean /average()
A = np.arange(2,14).reshape((3,4))
print(A)
print(np.mean(A))
print(np.mean(A,axis=0)) #对列求平均值
# np.average(A) 是求平均值的另一种方法
>>>输出:
array([[ 2, 3, 4, 5],
[ 6, 7, 8, 9],
[10, 11, 12, 13]])
7.5 #总体平均值
[6. 7. 8. 9.]#平均值输出
2.5.5 中位数median()
A = np.arange(2,14).reshape((3,4))
print(np.median(A)) # 中位数
>>>输出
>7.5
2.5.6 累加cumsum()
np.cumsum(A) #累加 有点像分布函数,每一次把前面几位的全部加起来
>>>输出:
array([ 2, 5, 9, 14, 20, 27, 35, 44, 54, 65, 77, 90], dtype=int32)
2.5.7 互减diff()
第一行第一列 和 第二行第一列互减 得出第一个数
第二行第一列 和 第三行第一列互减得出第二个数
所以这样得到的数组会比原来的少一列
#A:array([[ 2, 3, 4, 5],
# [ 6, 7, 8, 9],
# [10, 11, 12, 13]])
print(np.diff(A))
>>> 输出
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
2.6 axis=0,axis=1
axis=0对列操作
axis=1对行操作
a = np.random.random((2,4))
print(np.sum(a , axis=1)) # axis=1是对行求和
>>>输出
[1.93938446 2.34863228]
print(np.sum(a , axis=0)) # axis=0是对列求和
>>>输出
[1.34058574 1.29702913 0.71471214 0.93568973]
2.7排序sort()
A = np.arange(14,2,-1).reshape((3,4))
print(A)
>>>输出
array([[14, 13, 12, 11],
[10, 9, 8, 7],
[ 6, 5, 4, 3]])
b=np.sort(A) #默认按行排序
print(b)
>>>输出
array([[11, 12, 13, 14],
[ 7, 8, 9, 10],
[ 3, 4, 5, 6]])
2.8矩阵的转置transpose()
# A:array([[14, 13, 12, 11],
# [10, 9, 8, 7],
# [6, 5, 4, 3]])
print(np.transpose(A))
>>>输出
array([[14, 10, 6],
[13, 9, 5],
[12, 8, 4],
[11, 7, 3]])
print(A.T)
>>>输出
array([[14, 10, 6],
[13, 9, 5],
[12, 8, 4],
[11, 7, 3]])
print((A.T).dot(A)) #转置后和A矩阵乘
[[332 302 272 242]
[302 275 248 221]
[272 248 224 200]
[242 221 200 179]]
这里强调一下如果定义的是数组,是不能通过转置提升他的维度的,代码如下
import numpy as np
A = np.array([1,1,1])
print(A)
print(A.T)
>>>输出:
array([1, 1, 1])
array([1, 1, 1])
可以看出,一开始定义的是数组,即array( [ ] )
但如果一开始定义的是矩阵呢
import numpy as np
A = np.array([[1,1,1]])
print(A)
print(A.T)
array([[1, 1, 1]])
array([[1],
[1],
[1]])
可以看到如果一开始定义的是矩阵,就能够转置,把行向量变成列向量
2.8.1提升维度newaxis
2.8,1.1提升行的维度
print(A)
print(A[np.newaxis,:])
print(A[np.newaxis,:].shape)
>>>输出:
array([1, 1, 1])
[[1 1 1]]
(1, 3)
2.8.1.2提升列的维度
print(A)
print(A[:,np.newaxis])
print(A[:,np.newaxis].shape)
>>>输出:
array([1, 1, 1])
[[1]
[1]
[1]]
(3, 1)
2.9限制函数clip()
clip这个函数将将数组中的元素限制在a_min, a_max之间,大于a_max的就使得它等于 a_max,小于a_min,的就使得它等于a_min。
可以理解为信号处理时的滤波(截断函数)
print(np.clip(A,5,9)) #有点像滤波
>>>输出:
[[9 9 9 9]
[9 9 8 7]
[6 5 5 5]]
3.numpy的索引
import numpy as np
A = np.arange(3,15).reshape((3,4))
print(A)
>>>输出
>[[ 3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]]
A[2] #默认是行
A[2][1] #第几行第几列
array([11, 12, 13, 14]) #整行输出
12
如果想要检索单独一列的话,就要先转置再检索
3.1循环检索迭代
# A:[[ 3 4 5 6]
# [ 7 8 9 10]
#[11 12 13 14]]
#迭代出行
for row in A:
print(row)
[3 4 5 6]
[7 8 9 10]
[11 12 13 14]
#迭代出列
for column in A.T:
print(column)
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]
[ 6 10 14]
3.2降维
#多维变1维
print(A.flatten())
输出:
array([ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
for item in A.flat:
print(item)
输出:
3
4
5
6
7
8
9
10
11
12
13
14
4.array的合并
4.1vstack() & hstack()
水平合并 和 垂直合并
import numpy as np
A = np.array([1,1,1])
B = np.array([2,2,2])
print(np.vstack((A,B))) # vertical stack 垂直合并(堆栈)
[[1 1 1]
[2 2 2]]
C = np.vstack((A,B))
D = np.hstack((A,B))
print(C)
>>>array([[1, 1, 1],
[2, 2, 2]])
print(D)
>>>array([1, 1, 1, 2, 2, 2])
print(A.shape, C.shape, D.shape)
(3,) (2, 3) (6,)
4.2多个合并concatenate()
C= np.concatenate((A,B,B,A), axis=0)
print(C)
array([1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1])
5.numpy的copy & deep copy
import numpy as np
a = np.arange(4)
a
>>>输出:
array([0, 1, 2, 3])
b=a
c=a
a[0]=12
print(a)
>>>输出:
array([12, 1, 2, 3])
print(b)
>>>输出:
array([12, 1, 2, 3])
可以看到如果此时改变a的值的话,b的值也会跟着改变,如果此时只是想复制a的值,b不想随着a的改变而改变。
#深拷贝 开辟新地址 复制值,指针指向新地址
#浅拷贝 指针指向新地址
b = a.copy()
b
a[3]=44
print(b)
>>>输出
array([12, 1, 2, 3])
print(a)
>>>输出
array([12, 1, 2, 44])