NumPy是一个在Python中做科学计算的基础库,重在数值计算。
在Python中使用NumPy
import numpy as np
1. 使用NumPy生成数组常用方法
1. array(列表) np.array(list) 2. arange 类似range 可以有步长 np.arange(start, end, step) 3. np.random 生成随机数,默认为0到1 m行n列 np.random.random((m, n)) np.random.randint(start, end, size=(m, n)) numpy数组的toString方法 arr.astype("S")
#%%
import numpy as np
#%%
#1. array(列表)
a = np.array([1, 2, 3, 4])
print(a)
#%%
#2. arange 类似range 可以有步长
b = np.arange(10, 20)
print(b)
#%%
#3. np.random 0~1 m行n列
a1 = np.random.random((2, 3))
print(a1)
#0~10整数 3行3列
a2 = np.random.randint(0, 10, size=(3, 3))
print(a2)
#%%
b = np.array([1, 2, 3, 4, 5], dtype=np.int16) #'i2'
print(b)
print(b.dtype)
#%%
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
d = np.array([Person('name1', 18), Person('name2', 19)])
print(d[1].name)
#%%
strb = b.astype("S") #tostring
print(strb)
#%%
2. NumPy创建多维数组
arr.dim 获取维度 arr.shape 获取数组的形状 m行n列(m,n) arr.reshape((m,n)) #变成m行n列(2维) a2.reshape(m,) #变成1行m列(1维) a2.flatten() #变成1维 a21.size #元素个数 print(a21.itemsize) #每个元素占多少字节 int占4个字节
#%%
import numpy as np
#%%
a1 = np.array([1,2,3])
print(a1.ndim) #1
a2 = np.array([[1,2,3],[4,5,6]])
print(a2.ndim) #2
a3 = np.array([
[
[1,2,3],[4,5,6]
],
[
[7,8,9],[10,11,12]
]
])
print(a3.ndim)
#%%
print(a1.shape) #1个元素的元组 1维 3个元素
print(a2.shape) # 2维 2行3列
#%%
a21 = a2.reshape((1,6)) #变成1行6列(还是2维)
print(a21)
a21 = a2.reshape(6,) #变成1行6列(1维)
print(a21)
a21 = a2.flatten() #变成1维
print(a21)
#%%
print(a21.size) #元素个数
#%%
print(a21.itemsize) #每个元素占多少字节 int:4
#%%
3. 数组索引
a1[start:end:step] 切片索引 与list相同 arr>a 返回一个与arr相同形状的数组,大于a的位置为True,否则为False arr[arr>a]取出大于a的元素,返回一个1维数组
np.where(a>3) #>3数的坐标
np.where(a>3, 9, 10) #>3的数换成9 否则换成10
#%%
import numpy as np
#%%
a = np.random.randint(0,10,size=(6,6))
print(a)
#%%
print(a<5) #相应位置True/False
#%%
print(a[a<5])#<5的数 1个数组
#%%
a[1] = 0
print(a)
#%%
a[1] = np.array([1,2,3,4,5,6])
print(a)
#%%
a[a<3] = 1
print(a)
#%%
result = np.where(a>3) #>3数的坐标
print(result)
#%%
result = np.where(a>3, 9, 10) #>3的数换成9 否则换成10
print(result)
#%%
4. 数组形状操作
np.vstack([a1,a2]) #竖直拼接 np.hstack([a1,a2]) #水平拼接 np.vsplit(a1,[2,4]) #竖向切割 下标2 4的位置 #hsplit横向 a1.T #转置 a1.dot(a6) 矩阵乘法
data.sum()求和 data.mean()求平均数
关于axis
对于二维数组而言,如果axis=0,则沿着纵轴进行操作。如果axis=1,则沿着横轴进行操作。
对于更广泛的数组,如果axis=i ,则numpy沿着第i个下标变化的方向进行操作。
#%%
import numpy as np
#%%
a1 = np.random.randint(0,10,size=(6,6))
a2 = np.random.randint(0,10,size=(6,6))
print(a1)
print(a2)
#%%
a3 = np.vstack([a1,a2]) #竖直拼接
a3
#%%
a4 = np.hstack([a1,a2]) #水平拼接
a4
#%%
a5 = np.vsplit(a1,[2,4]) #竖向切割 下标2 4的位置
a5
#%%
a5[2][1][3]
#%%
#hsplit横向
a6 = a1.T #转置
a6
#%%
a1.dot(a6)
#%%
#%%
data.sum()
#%%
data.sum(axis=1)/data[0].size #除了delete用axis=1表示列以外,其他的大部分函数都是行
#%%
mean = data.mean()
mean
#%%
5. 深浅拷贝方法
c = a.view() #浅拷贝 d = a.copy() #深拷贝
6. csv文件操作
np.savetxt("14file.csv",a,fmt="%d",delimiter=",", header="line1, line2") delimiter:csv文件一般以逗号分隔数据 b= np.loadtxt("14file.csv",dtype=np.int,skiprows=1,delimiter=",")
skiprows=1:不读取第一行标题数据
csv方法
import csv
csv.reader(fp) 读文件
csv.DictReader(fp)以字典方式读文件
csv.writer(fp)写文件 writer.writerow(headers) 写一行数据
writeheader() 写一行标题 writer.writerows(values) 写多行数据
#%%
import csv
#%%
#以列表方式获取
with open('14file.csv','r')as fp:
reader = csv.reader(fp)
next(reader) #往下移1行 去掉标题
for x in reader:
print(x)
#%%
#以字典方式获取
with open('14file.csv','r') as fp:
#不包括第一行
reader = csv.DictReader(fp)
for x in reader:
print(x)
#%%
headers=['name','age','classroom']
values=[
('name1',18,'class1'),
('name2',18,'class1'),
('name3',18,'class2')
]
with open('16file.csv','w',newline='') as fp:
writer = csv.writer(fp)
writer.writerow(headers)
writer.writerows(values)
#%%
headers=['name','age','classroom']
values=[
{"name": 'name1',"age": 18,"classroom":222},
{"name": 'name2',"age": 18,"classroom":223},
]
with open('16file2.csv','w',newline='') as fp:
writer = csv.DictWriter(fp,headers)
writer.writeheader()
writer.writerows(values)
#%%
7. nan
np.NAN nan常数
np.isnan(data) 查看data中各项是不是nan 返回bool数组
#%%
import numpy as np
#%%
data = np.random.randint(0,10,size=(3,5))
data
#%%
data = data.astype(float)
data[0][1] = np.NAN
data
#%%
data[~np.isnan(data)] #一维数组 非NAN
#%%
lines = np.where(np.isnan(data))[0] #获取哪些行有NAN 0=行 1=列
data1 = np.delete(data,0,axis=0) #删除有NAN的行
data1
#%%
data[np.isnan(data)] = 0
data
8. random
np.random.seed(1) #种子 np.random.rand()生成随机数 np.random.randn(20) #正态分布 np.random.randint(start,end,size=(20)) #随机选正整数 np.random.choice(data,4) #从data中随机选4个数 np.random.choice(data,size=(2,2)) #从data中随机2行2列 np.random.shuffle(data) #打乱顺序
#%%
import numpy as np
#%%
np.random.seed(1) #种子
print(np.random.rand())
print(np.random.rand())
#%%
print(np.random.randn(20)) #正态分布
#%%
data = np.random.randint(1,10,size=(20))
data
#%%
choice = np.random.choice(data,4) #随机选4个数
choice
#%%
choice = np.random.choice(data,size=(2,2)) #随机2行2列
choice
#%%
np.random.shuffle(data) #打乱顺序
data
#%%
9. 常用函数
#%%
import numpy as np
#%%
#一元函数
abs sqrt square exp log sign变号 ceil floor round四舍五入 modf将整数和小数分隔开形成2个数组
isnan isinf cos sin tan arcsin arccos arctan
#%%
#二元函数
add subtract nultiply divide floor_divide取整 mod greater greater_equal less euqal not_equal logical_and& logical_or|
#%%
#聚合函数
np.nanXXX 忽略NAN数据
np.sum prod求积 mean std标准差 var方差 min max argmin最小值索引 argmax median中位数
np.prod(a,axis=0)
#%%
bool判断函数
np.any 验证所任何一个元素是否为真 np.all 验证所有元素是否为真
if(np.any(a==0)) a为数组 有一个为0则true
#%%
#排序
np.sort(a) -np.sort(-a)
np.take(a,indexes) 取指定下标的值
#%%
#其他函数
#