读取数据
np.loadtxt(name,dtype=, comments='#',delimiter=None, converters=None, skiprows=0, usecols=(1,2), unpack=False,ndmin=0):
frame:文件、字符串或产生器
dtype:数据类型,默认np.float
comments:跳过某些行,这里指, 如果行的开头为#就会跳过该行
delimiter:分隔字符串,默认空格
converters:对数据进行预处理的参数, 可以先定义一个函数
skiprows:跳过前几行,默认0
usecols:只读取指定列,这里指只读取1,2列,默认全部读取
unpack:如果为True,将按列读取,默认False
converters:对数据进行预处理的参数, 我们可以先定义一个函数
txt = 'c:\\Users\\loadtxt.txt'
a = np.loadtxt(txt,dtype=int,delimiter=',',skiprows=1,unpack=True)
#Out:
#array([[ 2, 3, 4],
# [ 3, 4, 5],
# [ 4, 5, 6],
# [ 5, 6, 7],
# [ 6, 7, 8],
# [ 7, 8, 9],
# [ 8, 9, 10],
# [ 9, 10, 11]])
创建数组
np.array():创建数组
np.array(range(start, stop, step)):
start: 计数从 start 开始。默认是从 0 开始;
stop: 计数到 stop 结束,但不包括 stop;
step:步长,不可为小数,默认为1。
np.arange(start, stop, step):
start: 计数从 start 开始。默认是从 0 开始;
stop: 计数到 stop 结束,但不包括 stop;
step:步长,支持小数,默认为1。
import numpy as np
a = np.array([1,2,3,4,5])
b = np.array(range(1,6,2))
c = np.arange(1,6,1.5)
print('a:%s b:%s c:%s' %(a,b,c))
#[out]:a:[1 2 3 4 5] b:[1 3 5] c:[1. 2.5 4. 5.5]
生成随机数组
np.random.rand(a,b):随机生成a行b列的数组,数组元素符合[0,1]之间均匀分布的随机样本
np.random.rand(2,3)
#Out:
#array([[0.69316799, 0.60458541, 0.01979631],
# [0.75141108, 0.48813725, 0.05425274]])
np.random.randn(a,b):随机生成a行b列的数组,数组元素符合标准正态分布N(0,1)
np.random.randn(2,3)
#Out:
#array([[-0.49229221, -1.66797528, 1.41183768],
# [ 0.79337647, -0.66594975, 0.35059854]])
np.random.randint(low,high,size=(a,b),dtype):随机生成a行b列的数组,数组元素为半开半闭区间[low,high)上离散均匀分布的整数值;若high=None,则取值区间变为[0,low)
np.random.randint(1,5,size=(2,3),dtype=int)
#Out:
#array([[4, 4, 4],
# [4, 4, 1]])
np.random.normal(loc=a,scale=b,size=(c,d)) :随机生成c行d列的数组,数组元素符合均值为a标准差为b正态分布。
np.random.normal(loc=0,scale=1,size=(2,3))
#Out:
#array([[ 0.52191241, -1.24927379, -0.06311665],
# [-1.75515889, -1.3952226 , 0.447512 ]])
np.random.random(size=a) :随机产生a个元素的一维数组,元素为[0.0, 1.0)之间的浮点数,默认size=None,此时只生成一个随机浮点数
np.random.random(size=3)
#Out: array([0.27244681, 0.99441891, 0.86932329])
np.random.random()
#Out: 0.6599702555660103
数组形状
np.shape(a):输出元组(),包含数组a维度,行数,列数。
a.reshape((a,b)):将数组a的形状改为a行b列,若不知道a的shape属性是多少,但是想让a变成只有一列,可使用a.reshape(-1,1),Numpy将自动计算行数。
a.transpose():对a转置
a = np.array([[1,2,3],[4,5,6]])
np.shape(a)
#Out: (2, 3)
a.reshape((3,2))
#Out:
#array([[1, 2],
# [3, 4],
# [5, 6]])
a.reshape((-1,1))
#Out:
#array([[1],
# [2],
# [3],
# [4],
# [5],
# [6]])
a = np.array([[1,2,3],[4,5,6]])
a.transpose()
#Out:
#array([[1, 4],
# [2, 5],
# [3, 6]])
a.transpose():对a转置,当数组为高维时,如参数为(1,0,2)表示将1轴变为0轴,0轴变为1轴,2轴不变,如下图
a = np.array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
A.transpose((1,0,2))
#Out:
#array([[[ 0, 1, 2, 3],
# [ 8, 9, 10, 11]],
#
# [[ 4, 5, 6, 7],
# [12, 13, 14, 15]]])
数组计算
两个数组的相加、相减以及相乘都是对应元素之间的操作。
广播的原则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
a = np.array([[1,2,3],[1,2,3]])
a*2
#[Out]:
#array([[2, 4, 6],
# [2, 4, 6]])
b = np.array([[1,1,1],[1,1,1]])
a-b
#[Out]:
#array([[0, 1, 2],
# [0, 1, 2]])
c = np.array([[1,2,3]])
a+c
#Out:
#array([[2, 4, 6],
# [2, 4, 6]])
d = np.array([[[1,1,1],[1,1,1]],[[1,1,1],[1,1,1]],[[1,1,1],[1,1,1]]])
a+d
#Out[25]:
#array([[[2, 3, 4],
# [2, 3, 4]],
#
# [[2, 3, 4],
# [2, 3, 4]],
#
# [[2, 3, 4],
# [2, 3, 4]]])
索引和切片
a = np.array([[1,2,3],[2,3,4],[3,4,5]])
a[[0,1],:] #切片a的第一行第二行所有元素
#Out:
#array([[1, 2, 3],
# [2, 3, 4]])
a = np.array([[1,2,3],[2,3,4],[3,4,5]])
a[[0,1],[0,2]] #切片a的第一行第一列和第二行第三列的元素
#Out: array([1, 4])
替换
a = np.array([[1,2,3],[2,3,4],[3,4,5]])
a[0,0]=3 #将第一行第一列的元素替换成1
print(a)
#[[3 2 3]
# [2 3 4]
# [3 4 5]]
a = np.array([[1,2,3],[2,3,4],[3,4,5]])
a[a<3]=6 #将小于3的所有元素替换成6
print(a)
#[[6 6 3]
# [6 3 4]
# [3 4 5]]
np.where(condition, x,y):满足条件(condition),输出x,不满足输出y。
a = np.array([[1,2,3],[2,3,4],[3,4,5]])
np.where(a<3, 6, a)
#Out:
#array([[6, 6, 3],
# [6, 3, 4],
# [3, 4, 5]])
np.where(condition):只有条件 (condition),没有x和y,则输出满足条件 (即非0) 元素的坐标
a = np.array([[1,2,3],[2,3,4],[3,4,5]])
np.where(a<4)
#Out[35]:
#(array([0, 0, 0, 1, 1, 2], dtype=int64),
# array([0, 1, 2, 0, 1, 0], dtype=int64))
a.clip(min, max):限制数组a的上下界,给定一个范围[a, b],数组中元素值小于a的,要被更改为a,数组中元素值大于b的,要被更改为b。
a = np.array([[1,2,3],[2,3,4],[3,4,5]])
a.clip(2,4)
#Out:
#array([[2, 2, 3],
# [2, 3, 4],
# [3, 4, 4]])
数组拼接
np.vstack((a,b)):将a,b两个数组按行放到一起
np.hstack((a,b)):将a,b两个数组按列放到一起
a = np.array([[1,2,3],[2,3,4]])
b = np.array([[3,4,5]])
np.vstack((a,b))
#Out:
#array([[1, 2, 3],
# [2, 3, 4],
# [3, 4, 5]])
a = np.array([[1,2,3],[2,3,4]])
b = np.array([[1,2],[2,3]])
np.hstack((a,b))
#Out:
#array([[1, 2, 3, 1, 2],
# [2, 3, 4, 2, 3]])
常用统计函数
a=np.array([[1,2,3],[1,2,3]])
a.sum(axis=0) #列元素求和
#Out: array([2, 4, 6])
a=np.array([[1,2,3],[1,2,3]])
a.sum(axis=1) #行元素求和
#Out: array([6, 6])
a=np.array([[1,2,3],[1,2,3]])
a.sum() #所有元素求和
#Out: 12
a=np.array([[1,2,3],[1,2,3]])
a.mean(axis=0) #列元素求均值
#Out: array([1., 2., 3.])
a=np.array([[1,2,3],[1,2,3]])
np.median(a,axis=0) #列元素求中位数
#Out: array([1., 2., 3.])
a=np.array([[1,2,3],[4,5,6]])
a.min(axis=0) #列元素求最小值
#Out: array([1, 2, 3])
a=np.array([[1,2,3],[4,5,6]])
a.max(axis=0) #列元素求最大值
#Out: array([4, 5, 6])
a=np.array([[1,2,3],[4,5,6]])
np.ptp(a,axis=0) #列元素求最大值与最小值之差
#Out: array([3, 3, 3])
a=np.array([[1,2,3],[4,5,6]])
a.std(axis=0) #列元素求标准差
#Out: array([1.5, 1.5, 1.5])
数组复制
a=b:完全不复制,a和b相互影响
a=np.array([[1,2,3],[4,5,6]])
b=a
#Out:
#a:array([[1, 2, 3],
# [4, 5, 6]])
#b:array([[1, 2, 3],
# [4, 5, 6]])
a[1,1]=10
#Out:
#a:array([[ 1, 2, 3],
# [ 4, 10, 6]])
#b:array([[ 1, 2, 3],
# [ 4, 10, 6]])
b[1,1]=0
#Out:
#a:array([[1, 2, 3],
# [4, 0, 6]])
#b:array([[1, 2, 3],
# [4, 0, 6]])
a = b[:]:视图的操作,会创建一个新对象a,但a的数据完全由b保管,两个数据变化一致,其与a=b的区别为:a=b将创建a与b两个快捷方式并指向同一文件;而a=b[:]先将b指向的文件复制一份作为副本,然后创建一个指向该副本的快捷方式a。
a=b.copy():复制,互相不影响
a=np.array([[1,2,3],[4,5,6]])
b=a.copy()
#Out:
#a:array([[1, 2, 3],
# [4, 5, 6]])
#b:array([[1, 2, 3],
# [4, 5, 6]])
a[1,1]=10
#Out:
#a:array([[ 1, 2, 3],
# [ 4, 10, 6]])
#b:array([[1, 2, 3],
# [4, 5, 6]])
b[1,1]=0
#Out:
#a:array([[ 1, 2, 3],
# [ 4, 10, 6]])
#b:array([[1, 2, 3],
# [4, 0, 6]])
其他函数
np.zeros((3,3)) #创建一个3行3列全为0的数组
#Out:
#array([[0., 0., 0.],
# [0., 0., 0.],
# [0., 0., 0.]])
np.eye(3) #创建一个对角线全为1的3行3列的方阵
#Out:
#array([[1., 0., 0.],
# [0., 1., 0.],
# [0., 0., 1.]])
a = np.array([[1,2,3],[4,5,6]])
np.argmax(a,axis=0) #获取列上最大值的位置
#Out: array([1, 1, 1], dtype=int64)
np.argmin(a,axis=1) #获取行上最小值的位置
#Out: array([0, 0], dtype=int64)