【Python工具包之Numpy】概述+array结构+数值计算+索引+排序+数组+运算+随机模块+读写

这篇博客详细介绍了Numpy的array结构、ndarray属性操作,包括一维和多维数组的索引与切片,数值计算、排序、数组形状操作、数组生成、运算、随机模块的使用以及读写操作,是学习Numpy的重要参考资料。

1、array结构

  • Numpy,数据由矩阵组成,矩阵计算使用Numpy(科学计算);
  • Numpy,list数据需要先转化成ndarray结构(n 表示的是n个 d dimension 维度 array 数组);
  • 对于ndarray结构来说,里面所有的元素必须是同一类型的 如果不是的话,会自动的向下进行转换;

数值类型
float–浮点型
str --字符串
int – 整型
object–字符串

2、ndarray基本属性操作

  • 使用之前需要先导入numpy工具包;
  • 退出需要重新运行工具包。
import numpy as np
  • type打印当前输入格式
wang_list = [1,2,3,4,5]
wang_array = np.array(wang_list)
wang_array
type(wang_array)

numpy.ndarray

  • dtype打印当前输入类型
wang_array.dtype

dtype(‘int32’)

  • astype:转换类型
wang_array.astype(np.float32)

array([ 1., 2., 3., 4., 5.], dtype=float32)

  • itemsize:打印当前数组大小
wang_array.itemsize

4

  • size:有几个元素
wang_array.size

5

  • .shape值;(m,n)表示m*n维数据,即有m个样本数据,每个数据有n个特征,可了解数据规模;也可debug。
wang_array.shape
np.shape(wang_array)

(5,)

  • dnim:维度
wang_array.ndim

1

  • fill:填充
wang_array.fill(0)
wang_array

array([0, 0, 0, 0, 0])

3、索引与切片

(1)一维数组

  • 索引与切片:跟Python都是一样的 还是从0开始的;
  • 从左取到右但是不包括右;
  • -1表示从最后一个。
wang_list = [1,2,3,4,5,6]
wang_array = np.array(wang_list)
wang_array[0]

1

wang_array[1:3]

array([2, 3])

wang_array[-3:]

array([4, 5, 6])

(2)多维数组索引

  • 需指定每个维度的索引;
  • 若未指定某一维度,表示取此维度所有数据;
  • 右边不指定维度可以省略冒号,左边不可;
  • 可通过索引定位到数据,然后对数据进行赋值。
wang_array = np.array([[1,2,3],
                      [4,5,6],
                      [7,8,9]])#3*3的二维数组(两个中括号)
wang_array[1,1]

5

wang_array[1,1]=10#赋值
wang_array

array([[ 1, 2, 3],
[ 4, 10, 6],
[ 7, 8, 9]])

wang_array[1]

array([ 4, 10, 6])

wang_array[:,1]

array([ 2, 10, 8])

wang_array[0,0:1]

array([1,2])

(3)赋值(=)&复制(copy)

等号赋值会改变原本数组的值,.copy复制不会改变原本数组的值。

  • 等号(=)赋值
wang_array2 = wang_array
wang_array2[1,1] = 100
wang_array

array([[ 1, 2, 3],
[ 4, 100, 6],
[ 7, 8, 9]])

  • .copy 复制
wang_array2 = wang_array.copy()
wang_array2[1,1] = 10000
wang_array2

array([[ 1, 2, 3],
[ 4, 10000, 6],
[ 7, 8, 9]])

wang_array

array([[ 1, 2, 3],
[ 4, 100, 6],
[ 7, 8, 9]])

(4)布尔类型的索引

  • np.arange(a,b,n):表示a和b之间等间隔产生n个数据;
  • dtype=bool,0表示False,1表示True,dtype设置格式。
wang_array = np.arange(0,100,10)
wang_array
mask = np.array([0,0,0,0,0,0,1,1,1,1],dtype=bool)#指定值
mask
wang_array[mask]#按照布尔类型值取数据

array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
array([False, False, False, False, False, False, True, True, True,
True])
array([60, 70, 80, 90])

  • random.rand(n),表示在0和1之间随机生成n个数据;
random_array = np.random.rand(10)#
random_array
mask = random_array > 0.5#做判断,条件值
mask
wang_array[mask]

array([0.34173479, 0.77632628, 0.34125884, 0.5262027 , 0.62157668,0.5484839 , 0.81023541, 0.75616737, 0.61977412, 0.78414371])
array([False, True, False, True, True, True, True, True, True,
True])
array([ 0, 10, 30, 40, 50, 60, 80, 90])

  • where操作,输出满足条件的索引值的位置
wang_array = np.array([10,20,30,40,50])
wang_array > 30#输出布尔值
wang_array[np.where(tang_array > 30)]

array([False, False, False, True, True], dtype=bool)
array([40, 50])

4、数值计算

  • 对array数组进行加减乘除等操作,表示对数组里面的每一个数据进行此操作;
array = [1,2,3,4,5]
array = np.array([1,2,3,4,5])
array2 = array + 1
array2

array([2, 3, 4, 5, 6])

  • 数组和数组进行数值计算,需要两个数组具有相等的(.shape)值(结构一样);
array2 *array

array([ 6, 12, 20, 30, 42])

  • 二维数组
wang_array=np.array([[1,2,3],[4,5,6]])
wang_array

array([[1, 2, 3],
[4, 5, 6]])

  • 指定要进行的操作是沿着什么轴(维度),axis=0表示纵轴,axis=1表示横轴。(不指定表示对所有元素执行此操作)
np.sum(wang_array,axis=0)

array([5, 7, 9])

np.sum(wang_array,axis=1)

array([6, 5])

wang_array.sum()#未指定轴

21

prod:乘积操作
sum:求和
mean:均值
std:标准差
var:方差
clip(m,n):截断操作,数值大小从m开始,到n结束,不满足条件的替换

wang_array=np.array([[1,2,3],[4,5,6]])
wang_array.clip(2,4)

array([[2, 2, 3],
[4, 4, 4]])

round :四舍五入,decimals小数点位数

a= np.array([1.2,3.56,6.41])
a.round()
a.round(decimals=1)

array([1., 4., 6.])
array([ 1.2, 3.6, 6.4])

argmin:找到最小值索引位置
argmax:找到最大值索引位置
argsort:顺序索引位置,默认横向

5、排序(sort)

  • 默认横向升序排列
  • axis=0为降序排列
a = np.array([[1.5,1.3,7.5],
              [5.6,7.8,1.2]])
np.sort(a,axis = 0)

array([[ 1.5, 1.3, 1.2],
[ 5.6, 7.8, 7.5]])

  • linspace(a,b,n):表示从a开始,到b结束的等间隔的n个值(和arange不同,见上文)
  • searchsorted(array1,array2):返回array2插入array1的索引位置(按大小顺序插入)
a = np.linspace(0,10,10)
values = np.array([2.5,6.5,9.5])
np.searchsorted(a,values)

-array([ 0. , 1.11111111, 2.22222222, 3.33333333, 4.44444444, 5.55555556, 6.66666667, 7.77777778, 8.88888889, 10. ])
-array([3, 6, 9], dtype=int64)

  • lexsort:花式排序(默认升序,-1表示降序)
a = np.array([[1,0,6],
              [1,7,0],
              [2,3,1],
              [2,4,0]])
index = np.lexsort([-1*a[:,0],a[:,2]])#第一列降序,第三列升序
index

array([0, 1, 3, 2], dtype=int64)

a = a[index]
a

array([[2, 4, 0],
[1, 7, 0],
[2, 3, 1],
[1, 0, 6]])

6、数组形状

  • shape、reshape:更改数组形状
a= np.arange(10)#10个元素的一维数组
a
a.shape

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
(10,)

a.shape=2,5#更改shape值,2行5列的二维数组
a

array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])

a.reshape(1,10)#更改shape值,1行10列的二维数组
a

array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])

  • np.newaxis:增加新轴(左边表示行、右边表示列),可加多个轴
a=a[np.newaxis,:]#轴加在行
a.shape

(1, 10)

a=a[:,np.newaxis]#轴加在列
a.shape

(10, 1)

  • squeeze:压缩没有元素的轴
a=a.squeeze()
a.shape

(10,)

  • .transpose:转置
  • .T:转置
a.shape = 2,5
a,transpose()

array([[0, 5],
[1, 6],
[2, 7],
[3, 8],
[4, 9]])

  • .concatenate((a,b),axis=0):数组的连接,axis=0纵向拼接(默认),axis=1横向拼接
  • .vstack((a,b)),纵向拼接
  • .hstack((a,b)),横向拼接
a = np.array([[1,2,3],[3,4,5]])
b=np.array([[6,7,8],[8,9,6]])
c=np.concatenate((a,b),axis=1)
c

array([[ 1, 2, 3, 6, 7, 8],
[3, 4, 5, 8, 9, 6]])

  • .flatten,拉长操作
a.flatten

array([1,2,3,3,4,5])

7、数组生成

  • np.arange(10)
  • np.arange(2,20,2)
  • np.arange(2,20,2,dtype=np.float32)
  • np.linspace(0,10,10)
  • np.logspace(0,1,5)#默认以10为底
  • np.zeros(3)
  • np.zeros((3,3))
  • np.ones((3,3))
  • np.ones((3,3)) * 8
np.ones((3,3)) * 8

array([[ 8., 8., 8.],
[ 8., 8., 8.],
[ 8., 8., 8.]])

  • np.empty(6)
a = np.empty(6)
a

array([0., 0., 0., 0., 0., 0.])

  • fill
a.fill(1)
a

array([ 1., 1., 1., 1., 1., 1.])

  • np.zeros_like(array1)#0替换
  • np.ones_like(array2)#1替换
  • identity(n):n*n的二维数组
np.identity(5)

ay([[ 1., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 0.],
[ 0., 0., 1., 0., 0.],
[ 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 1.]])

8、运算

  • multiply:对应位置相乘
  • dot:一维的时候是求内积(对应位置相乘求和),二维是矩阵运算
x = np.array([5,5])
y = np.array([2,2])
np.dot(x,y)

20

x.shape = 2,1
y.shape = 1,2
print (x.shape)
print (y.shape)

-(2, 1)
-(1, 2)

np.dot(x,y)

array([[10, 10],
[10, 10]])

np.dot(y,x)

array([[20]])

  • logical_and:与()np.logical_and(x,y)
  • logical_or:或
  • logical_not:非
y = np.array([1,1,1,4])
x = np.array([1,1,1,2])
x == y
np.logical_and(x,y)
np.logical_or(x,y)
np.logical_not(x,y)

array([ True, True, True, False], dtype=bool)
array([ True, True, True, True], dtype=bool)
array([ True, True, True, True], dtype=bool)
array([0, 0, 0, 0])

9、随机模块

  • random.rand()
  • 一般随机模块传进来的都是shape值
  • 所有的值都是从0到1
np.random.rand(3,2)

array([[ 0.87876027, 0.98090867],
[ 0.07482644, 0.08780685],
[ 0.6974858 , 0.35695858]])

  • random.randint()
  • 左闭右开,指定整数值,size指定范围
np.random.randint(10,size = (5,4))#5行4列二维矩阵,数值为小于10整数

array([[8, 0, 3, 7],
[4, 6, 3, 4],
[6, 9, 9, 8],
[9, 1, 4, 0],
[5, 9, 0, 5]])

  • np.random.random_sample()#随机采样,得到一个随机的结果
  • np.random.randint(0,10,3)#从0到10取3个随机整数,左闭右开
  • 指定分布,np.set_printoptions#指定精度:小数位数
np.set_printoptions(precision = 2)
mu, sigma = 0,0.1
np.random.normal(mu,sigma,10)#指定高斯分布

array([ 0.01, 0.02, 0.12, -0.01, -0.04, 0.07, 0.14, -0.08, -0.01, -0.03])

  • 洗牌,random.shuffle(乱序)
a= np.arange(10)
np.random.shuffle(a)
a

array([6, 2, 5, 7, 4, 3, 1, 0, 8, 9])

  • 随机的种子random.seed(指定种子值),按照恒定的方式随机
np.random.seed(100)
mu, sigma = 0,0.1
np.random.normal(mu,sigma,10)

array([-0.17, 0.03, 0.12, -0.03, 0.1 , 0.05, 0.02, -0.11, -0.02, 0.03])

10、读写操作

(1)读取TXT

  • python方法
%%writefile w.txt#写数据
1 2 3 4 5 6
2 3 5 8 7 9

data = []
with open('w.txt') as f:
    for line in f.readlines():
        fileds = line.split()
        cur_data = [float(x) for x in fileds]
        data.append(cur_data)
data = np.array(data)
data
  • numpy方法,loadtxt
data = np.loadtxt('w.txt')
data

-路径最好放到和代码一起
-skiprows : 去掉几行
-delimiter = ‘,’ :分隔符
-usecols = (0,1,4) :指定使用哪几列
-fmt=’%d’:格式,默认科学计数法

data = np.loadtxt('w.txt',delimiter = ',',skiprows = 1)
data
  • 保存
np.savetxt('w.txt',tang_array,fmt='%.2f',delimiter = ',')

(2)读取array结构

  • 保存数组
x1 = np.array([[1,2,3],[4,5,6]])
np.save('x1.npy',tang_array)#保存数组,npy常用
  • 使用数组
aa = np.load('x1.npy')
aa

array([[1, 2, 3],
[4, 5, 6]])

法2

x2 = np.arange(10)
np.savez('xx。npz',a=x1,b=x2)#npz,不常用
data['a']

array([[1, 2, 3],
[4, 5, 6]])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值