目录
(2)通过改变数组的shape属性,在保持数组元素个数不变的情况下,改变数组每个轴的长度
6.ufunc运算:Numpy里面内置的许多ufunc函数都是在C语言级别实现的,因此它们的运算速度非常快
一.Numpy的安装
pip install numpy
二.Numpy的基本使用
1.导入Numpy库,命令如下:
import numpy as np #底层是用C语言实现的,效率高
2.数组的创建
需要创建数组才能进行其他操作。array函数传递Python的序列对象创建数组
(1)例如,下面分别创建一维数组和二维数组:
a = np.array([1, 2, 3, 4])
b = np.array((5, 6, 7, 8))
c = np.array([[1, 2, 3, 4],[5, 6, 7, 8],[7, 8, 9, 10]])
数组的大小可以通过shape属性获得:
print(a.shape)#(4,)
print(b.shape)#(4,)
print(c.shape)#(3, 4)
即a、b为4行一列,c为三行四列
(2)通过改变数组的shape属性,在保持数组元素个数不变的情况下,改变数组每个轴的长度
c.shape = 2, -1
print(c)#[[ 1 2 3 4 5 6]
#[ 7 8 7 8 9 10]]
(3)reshape
本身不变,得到一个转化之后的值,创建一个改变之后的新数组.
d = c.reshape(3, 4)
print(c)
# [[ 1 2 3 4 5 6]
# [ 7 8 7 8 9 10]]
print(d)
#[[ 1 2 3 4]
#[ 5 6 7 8]
#[ 7 8 9 10]]
e = a.reshape(2,2)
print(a)#[1 2 3 4]
print(e)
#[[1 2]
#[3 4]]
数组a和e共享数据存储内存区域,因此修改其中任意一个数的元组都会发生改变
a[0] = 10
print(e)
# [[10 2]
# [ 3 4]]
3.数组的类型
print(f.dtype)#float64
可以通过dtype参数在创建时指定元素类型
a = np.arange(0, 1, 0.1)
#最后一个值是取不到的:arrange(开始值,终值,步长)
print(a)#[0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
4.数组的其他创建方式
(1)arrange函数
类似于Python的range函数
a = np.arange(0, 1, 0.1)
#最后一个值是取不到的:arrange(开始值,终值,步长)
print(a)#[0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
(2)linspace函数
#linspace(开始值,终值,元素个数,[endpoint])
#endpoint指定是否包括终值,默认设置包括终值
#endpoint是否包括终值,默认设置包括终值
b = np.linspace(0, 1, 12)
print(b)
(3)logspace函数
#logspace创建10^0到10^2的 等比数列
c = np.logspace(0, 2, 10)
print(c)
5.数组元素的存取
a = np.arange(10)
print(a[2 : 5])#[2 3 4]
print(a[2 : -1])#[2 3 4 5 6 7 8]
6.ufunc运算:Numpy里面内置的许多ufunc函数都是在C语言级别实现的,因此它们的运算速度非常快
x = [i * 0.001 for i in range(1000000)]
#(碰到的一个问题)
#start = time.clock() #time.clock是被弃用的方法,在python3.8的时候将被移除
#use time.perf_counter or time.process_time instead
start = time.perf_counter()
#列表得用for循环进行赋值
for i,t in enumerate(x):#enumerate同时列出列表的下标和对应列表的值
x[i] = math.sin(t)
print('math.sin:', time.perf_counter() - start)#math.sin: 0.378968541
x = [i * 0.001 for i in range(1000000)]
x = np.array(x) #将列表转化为数组
start = time.perf_counter()
#数组可以直接用np.sin()函数进行调用
np.sin(x)
print('numpy.sin:', time.perf_counter() - start)#numpy.sin: 0.012504123000000034
可以发现,numpy.sin 比math.sin 快得多
7.矩阵的运算
矩阵的乘法要求左边的列数要等于右边矩阵的行数
矩阵的乘积可以使用dot函数计算。对于二维数组,它计算的是矩阵的乘积,对于一维数组,它计算的是点积
a = np.arange(12).reshape(4, 3)
print(a)
# [[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 9 10 11]]
b = np.arange(12, 24).reshape(3, 4)
print(b)
# [[12 13 14 15]
# [16 17 18 19]
# [20 21 22 23]]
c = np.dot(a, b)
print(c)
# [[ 56 59 62 65]
# [200 212 224 236]
# [344 365 386 407]
# [488 518 548 578]]
8.文件的存取
(1)读写一维和二维的数组:
#文件的存取
a = np.arange(0, 12, 0.5).reshape(4, -1)
#默认按照‘%。18e’格式保存数据,以空格分隔
np.savetxt("./a.txt", a)#将a保存成text
b = np.loadtxt("./a.txt")
print(b)
# [[ 0. 0.5 1. 1.5 2. 2.5]
# [ 3. 3.5 4. 4.5 5. 5.5]
# [ 6. 6.5 7. 7.5 8. 8.5]
# [ 9. 9.5 10. 10.5 11. 11.5]]
(2)改为整数保存数据
#fmt = "%d"表示只保存整数部分,delimiter = ","表示用’,’进行分隔
np.savetxt("./a2.txt", a, fmt = "%d", delimiter = ",")
b2 = np.loadtxt("./a2.txt", delimiter=",")
print(b2)
# [[ 0. 0. 1. 1. 2. 2.]
# [ 3. 3. 4. 4. 5. 5.]
# [ 6. 6. 7. 7. 8. 8.]
# [ 9. 9. 10. 10. 11. 11.]]