import numpy as np
a = 1
a
1
for i in range(0,10): print(i)
0 1 2 3 4 5 6 7 8 9
b = 10
a + b
11
for i in range(10): print(i)
0 1 2 3 4 5 6 7 8 9
data = [i * 2 in range(100)]
for item in data: print(item)
True
%timeit items = [i**2 for i in range(1000000)]
291 ms ± 16.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit items = [i**2 for i in range(1000)]
244 µs ± 7.88 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit items = [i**2 for i in range(10)]
2.47 µs ± 44.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit L = [] for i in range(10000): L.append(i)
634 µs ± 26.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
这里可以获得到执行这一段的大概需要的时间
会根据这一句话的时间复杂度来改变loop的次数
生成表达式会快一些的
%time items = [i**2 for i in range(3500000)]
Wall time: 1.02 s
可以使用%time不取多次,但是不稳定
果然比C++慢太多,3500000就基本上超时了
import numpy as np
np.__version__ #numpy版本显示
'1.19.2'
# python原版创建数组的方式 L = [i for i in range(100)] # 这种的效率会比较低
# 利用array的方式来创建 import array
arr = array.array('i', [i for i in range(10)]);
arr
array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[5]
5
#arr[2] = "Aed" #这样就会报错了,array类型是限定的类型 #相对的效率会比较高 #没有配置矩阵相对应的算法封装
# 利用python中的array库写出来的 nparr = np.array([0,1,2,3,4,5,6,7,8,9])
nparr[5]
5
nparr[5] = 100
nparr[5]
100
#nparr[5] = "awd" #这样是报错的,强类型 nparr.dtype
dtype('int32')
nparr[5] = 123.123
nparr[5]
123
nparr = np.array([1, 2, 3.5])
nparr.dtype #初始的时候会确定类型
dtype('float64')
np.zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.zeros(10).dtype
dtype('float64')
np.zeros(10, dtype = int) # 可以设置类型
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
#还可以指定形状 #可以传入元组 np.zeros((3, 5))
array([[0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.]])
np.zeros(shape = (5, 5), dtype = float)
array([[0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.], [0., 0., 0., 0., 0.]])
#全1矩阵 np.ones(shape = (3, 5), dtype = int)
array([[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]])
创建一个由任意数字组成的矩阵
np.full((3, 3), 666)
array([[666, 666, 666], [666, 666, 666], [666, 666, 666]])
np.full(shape = (5, 5), fill_value = 555)
array([[555, 555, 555, 555, 555], [555, 555, 555, 555, 555], [555, 555, 555, 555, 555], [555, 555, 555, 555, 555], [555, 555, 555, 555, 555]])
[i for i in range(0, 20, 2)] #原生pythonrange
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
np.arange(0, 20, 0.2) #这里是可以传入浮点数的,而上边的不可以的
array([ 0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8, 2. , 2.2, 2.4, 2.6, 2.8, 3. , 3.2, 3.4, 3.6, 3.8, 4. , 4.2, 4.4, 4.6, 4.8, 5. , 5.2, 5.4, 5.6, 5.8, 6. , 6.2, 6.4, 6.6, 6.8, 7. , 7.2, 7.4, 7.6, 7.8, 8. , 8.2, 8.4, 8.6, 8.8, 9. , 9.2, 9.4, 9.6, 9.8, 10. , 10.2, 10.4, 10.6, 10.8, 11. , 11.2, 11.4, 11.6, 11.8, 12. , 12.2, 12.4, 12.6, 12.8, 13. , 13.2, 13.4, 13.6, 13.8, 14. , 14.2, 14.4, 14.6, 14.8, 15. , 15.2, 15.4, 15.6, 15.8, 16. , 16.2, 16.4, 16.6, 16.8, 17. , 17.2, 17.4, 17.6, 17.8, 18. , 18.2, 18.4, 18.6, 18.8, 19. , 19.2, 19.4, 19.6, 19.8])
np.arange(0, 20) #默认的步长为1 np.arange(20) #默认的起始点为0
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
np.linspace(0, 20, 10) #等长的截取十个点(是包括前后两个边界的)
array([ 0. , 2.22222222, 4.44444444, 6.66666667, 8.88888889, 11.11111111, 13.33333333, 15.55555556, 17.77777778, 20. ])
np.random.randint(0, 10) #取一个从0到10(不取到10)的随机数
7
np.random.randint(0, 10, 10) #这里是从0到10随机取出来10个数(但是不会取到10)
array([5, 6, 4, 7, 4, 8, 3, 9, 8, 0])
#用这个案例来验证 np.random.randint(0, 1, 10) #这里就只能取到0了
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
np.random.randint(4, 8, size = 10) #最好还是标一下最后的size
array([5, 4, 5, 7, 4, 5, 4, 7, 7, 5])
#size还可以是一个元组,酒可以得到一个矩阵 np.random.randint(0, 10, size=(3,5)) #这样就可以得到一个3,5的随机数矩阵
array([[9, 4, 5, 5, 3], [7, 3, 3, 6, 8], [0, 9, 7, 0, 8]])
np.random.seed(666)
np.random.randint(0, 10, size=(3,5))
array([[2, 6, 9, 4, 3], [1, 0, 8, 7, 5], [2, 5, 5, 4, 8]])
np.random.seed(666) np.random.randint(0, 10, size=(3,5))
array([[2, 6, 9, 4, 3], [1, 0, 8, 7, 5], [2, 5, 5, 4, 8]])
np.random.seed(666) np.random.randint(0, 10, size=(3,5))
array([[2, 6, 9, 4, 3], [1, 0, 8, 7, 5], [2, 5, 5, 4, 8]])
np.random.seed(666) np.random.randint(0, 10, size=(3,5))
array([[2, 6, 9, 4, 3], [1, 0, 8, 7, 5], [2, 5, 5, 4, 8]])
np.random.seed(666) np.random.randint(0, 10, size=(3,5))
array([[2, 6, 9, 4, 3], [1, 0, 8, 7, 5], [2, 5, 5, 4, 8]])
np.random.seed(666) np.random.randint(0, 10, size=(3,5))
array([[2, 6, 9, 4, 3], [1, 0, 8, 7, 5], [2, 5, 5, 4, 8]])
#可以看到只要随机种子他是一样的,生成的矩阵就是相同的
np.random.random() #默认情况下是随机生成一个0~1的随机数(浮点数)
0.7315955468480113
np.random.random((3, 5))
array([[0.8578588 , 0.76741234, 0.95323137, 0.29097383, 0.84778197], [0.3497619 , 0.92389692, 0.29489453, 0.52438061, 0.94253896], [0.07473949, 0.27646251, 0.4675855 , 0.31581532, 0.39016259]])
#这里是一个均匀分布的随机数 np.random.random(10)
array([0.26832981, 0.75366384, 0.66673747, 0.87287954, 0.52109719, 0.75020425, 0.32940234, 0.29130197, 0.00103619, 0.6361797 ])
np.random.normal() #这样生成的随机数就符合均值为0,方差为1的分布
-1.5644858645303779
np.random.normal(10, 100) #这里均值为10,方差为100的随机数,高斯分布
-152.8790044148518
np.random.normal(0, 1, (3, 5)) #这样就是生成一个正态分布的随机数矩阵
array([[ 1.23174866, -0.91360034, -0.27084407, 1.42024914, -0.98226439], [ 0.80976498, 1.85205227, 1.67819021, -0.98076924, 0.47031082], [ 0.18226991, -0.84388249, 0.20996833, 0.22958666, 0.26307642]])
np.random.normal? #这样可以查询文档的
File "", line 1 np.random.normal? #这样可以查询文档的 ^ SyntaxError: invalid syntax
help(np.random.normal) #这样就不用新开窗口了
import numpy as np
x = np.arange(10) x
X = np.arange(15).reshape(3, 5) X
x.ndim #可以得到x矩阵的维数
X.ndim
x.shape #返回的是一个元组
X.shape #返回的是一个两维的元组
x.size #获得大小
X.size #获得大小
X
x[1]
X[1]
X[1][1] #这样是不建议是这么访问的
#可以倒序查询 比如倒数第一个元素 x[-1]
X[(0, 0)] #建议里边加一个元组
X[0, 0] #当然建议这样写
x[0: 5] #切片简介
x[:5] #这样就是从第一个开始读取
x[5:] #这样就是从索引值为5的位置开始一直读取到最后一位
x[::2] #第三个参数为步长
x[::-1] #当然也是可以倒序查询的
X #numpy也可以轻松的访问到多维数组的元素
X[:2, :3] #前两行的前三列,组合切片
X[:2][:3]
X[:2] #然后取前三行
#即使在访问单一元素多使用逗号的方式来访问
X[::-1, ::-1] #倒序查询
X[0, :] #这样就是取到整个第0行 #变成了一个向量 X[0, :].ndim
subX = X[:2, :3] #这里其实没有创建了一个全新的矩阵,这里是引用的方式来获取到了子矩阵 subX #修改子矩阵会修改原矩阵,优先考虑效率
subX[1, 2] = 100
subX
X #这里就变了
#要想获得单独的全新的矩阵,调用copy函数 subX2 = X[:2, :3].copy() subX2
subX2[0, 0] = 1000
subX2
X #这里就没有变化了
#可以改变维度 x
x.shape
x.ndim
x.reshape(2, 5) #根据x改变一下维度
A = x.reshape(2, 5) A
B = x.reshape(10, -1) #-1就代表自动改变 B #得到了10行的矩阵
x.reshape(2, -1)
#x.reshape(3, -1) #这样是不行的
x = np.array([1, 2, 3]) y = np.array([3, 2, 1])
x
y
np.concatenate([x, y]) #这样可以得到一个合成的
z = np.array([666, 666, 666])
np.concatenate([x, y, z])
A = np.array([[1, 2, 3], [4, 5, 6]])
B = np.zeros((3, 3))
A
B
np.concatenate([A, A])
np.concatenate([A, B])
C = np.zeros((2, 6))
C
#np.concatenate(A, C) #这样是会报错的 #矩阵的合并我们需要列数是相等的 #行数是代表着样本的数量 #列数是代表着特征的数量 #因为合并矩阵目的是要去合并样本,而不是合并他们的特征
#默认是合并列 #但是我们也可以修改的 np.concatenate([A, A], axis = 1) #这样就是沿着第二个维度来合并了 #也就是沿着列来合并
np.concatenate([A, A], axis = 0) #默认是第0个维度
#np.concatenate([A, z]) #这里z是一维的向量 #这里我们这个函数是不能将低维的向量合并到高维的矩阵当中的 #这样会报错的
np.concatenate([A,[z]]) #自己想的,加一个中括号升维
np.concatenate([A, z.reshape(1, -1)])
#当然还有一个更加简便的方式 np.vstack([A, z]) #容错性很好,自动的叠加
B = np.full((2, 2), fill_value = 666) B
np.hstack([A, B])
a = 1
x = np.arange(10) x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.split(x, (3, 7)) #分割对象,分割点(列表指定多个分割点)
[array([0, 1, 2]), array([3, 4, 5, 6]), array([7, 8, 9])]
#这里就将对象x分割成了3个部分 [x1,x2,x3] = np.split(x, (3, 7))
x1
array([0, 1, 2])
x2
array([3, 4, 5, 6])
x3
array([7, 8, 9])
np.split(x, [1]) #传入的是列表不能是元组
[array([0]), array([1, 2, 3, 4, 5, 6, 7, 8, 9])]
A = np.arange(16).reshape((4, 4)) A
array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]])
[A1, A2] = np.split(A, [2], axis = 1)
A1
array([[ 0, 1], [ 4, 5], [ 8, 9], [12, 13]])
A2
array([[ 2, 3], [ 6, 7], [10, 11], [14, 15]])
upper, lower = np.split(A, [2], axis = 0)
upper
array([[0, 1, 2, 3], [4, 5, 6, 7]])
lower
array([[ 8, 9, 10, 11], [12, 13, 14, 15]])
left, right = np.hsplit(A, [2])
left
array([[ 0, 1], [ 4, 5], [ 8, 9], [12, 13]])
right
array([[ 2, 3], [ 6, 7], [10, 11], [14, 15]])
#数据分割的意义
a = (0, 1, 2)
b = (0, 2, 4)
n = 10
L = [i for i in range(n)] L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2 * L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
A = [] for i in L: A.append(i * 2)
A
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
n = 100000 L = [i for i in range(n)]
%%timeit A = [] for i in L: A.append(i * 2)
58.2 ms ± 1.14 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%%timeit A = [2 * e for e in L]
42.7 ms ± 8.67 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
L = np.arange(n)
%%timeit A = np.array(2 * e for e in L)
1.63 µs ± 55.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
L
array([ 0, 1, 2, ..., 99997, 99998, 99999])
test = np.arange(1, 10) test
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
test = test.reshape((3, 3)) test
array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
np.exp(test)
array([[2.71828183e+00, 7.38905610e+00, 2.00855369e+01], [5.45981500e+01, 1.48413159e+02, 4.03428793e+02], [1.09663316e+03, 2.98095799e+03, 8.10308393e+03]])
np.log(test)
array([[0. , 0.69314718, 1.09861229], [1.38629436, 1.60943791, 1.79175947], [1.94591015, 2.07944154, 2.19722458]])
A = np.arange(4).reshape(2, 2) A
array([[0, 1], [2, 3]])
B = np.full((2, 2), fill_value = 10) B
array([[10, 10], [10, 10]])
A + B
array([[10, 11], [12, 13]])
A * B #这样子得到的不是A和B矩阵的矩阵相乘法
array([[ 0, 10], [20, 30]])
A - B
array([[-10, -9], [ -8, -7]])
A.dot(B) #这样就是代表了A矩阵乘以B矩阵
array([[10, 10], [50, 50]])
A.T #这样是求A矩阵的转置矩阵
array([[0, 2], [1, 3]])