python数据分析——numpy基础(相关方法以及具体操作)

本文详细介绍了NumPy的基本函数如arange、ones、zeros等,以及数组索引、切片、变形、组合、分割和运算方法,包括四则运算、比较和逻辑运算,以及通用函数的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、基本函数

np.arange()
np.ones()
np.ones_like()
np.zeros()
np.zeros_like()
np.empty()
np.empty_like()
np.eye()
np.identity()
np.diag
np.linspace()
np.logspace()

1、np.arange()

# arange()方法与python中的range()函数一致
# 创建一个范围数组
np1 = np.arange(5)
print(np1)
np2 = np.arange(0, 100, 2)
print(np2)

在这里插入图片描述
2、np.ones np.ones_like

# np.ones   np.ones_like
n1 = np.ones(4)  # 方法里一个值代表一位数组的元素个数
print(n1)
n2 = np.ones((3, 4))  # 元组括起来之后分别表示行列数
print(n2)
# 创建一个像np2数组结构的数据,里面的元素都是1
n3 = np.ones_like(np2)
print(n3)

在这里插入图片描述
3、np.zeros np.zeros_like

# np.zeros   np.zeros_like
# 两个函数效果,及用法与ones一致
n1 = np.zeros(3)
print(n1)
n2 = np.zeros((2, 4))
print(n2)
n3 = np.zeros_like(np1)
print(n3)

在这里插入图片描述
4、np.empty   np.empty_like

# np.empty   np.empty_like
n = np.array([1,2,3,4])
n1 = np.empty(3)
print(n1)
n2 = np.empty((2, 3))
print(n2)
n3 = np.empty_like(n)
print(n3)

在这里插入图片描述
5、np.eye np.identity

# 创建一个对角线为1的4×4的数组
# 如果说想要改一个对角线的话可以通过k参数进行设置
n1 = np.eye(4)
print(n1)
n1 = np.eye(4, k = 1)
print(n1)
n1 = np.eye(3, 4)
print(n1)
n2 = np.identity(3)
print(n2)

np.identity()的详解
产生的数组将会是一个正方形的数组
在这里插入图片描述
np.eye()的详解
如果只传参数N的话,那么就会产生一个由N参数(行数)控制的一个正方形的数组
如果传入参数N和M的话,如果N==M那么就会产生一个正方形的数组,如果N!=M,那么就会产生一个N行M列的数组
在这里插入图片描述
在这里插入图片描述

6、np.diag()
创建一个以指定元素为对角线元素的数组,参数k可以控制对角线的位置,>0向右上角移动,<0向左下角移动

n1 = np.diag([1,2,3,4,5])
print(n1)
n1= np.diag([1,2,3, 4], k = -2)
print(n1)

在这里插入图片描述
7、np.linspace()
在这里插入图片描述
产生一个由参数指定范围的平均数组
结束位置的12是包含的

n1 = np.linspace(1, 12, 4)
print(n1)

在这里插入图片描述
8、np.logspace()
在这里插入图片描述
创建一个由base^ start到 base ^ stop范围的一个平均数组
默认的base是10

n1 = np.logspace(2, 3, num = 4)
print(n1)

在这里插入图片描述


2、基本的属性

dtype返回数组中元素的类型
shape返回由整数组成的元组,元组中的每个整数依次对应数组的每个轴的元素个数
size返回一个整数,代表数组中元素的个数
ndim返回一个整数,代表数组的轴的个数,即维度
nbytes返回一个整数,代表用于保存数据的字节数

在这里插入图片描述

在这里插入图片描述

import numpy as np
# 返回数组中的元素类型
d = np.array([1,2,3,4,5])
print(d.dtype)

# astype()修改原来元素的数据类型的元素
# 但是这个操作只是复制了一个数组而已,
# 并不是直接去修改数组里面的类型
res = d.astype(float)
print(res)
print(d.dtype)

# shape 表示数组的形状
d1 = np.arange(20).reshape((4, 5))
print(d1)
print(d1.shape)

# size 返回一个整数,代表数组中的元素个数
print(d1.size)

# ndim  返回一个整数,代表数组的轴的个数
print(d1.ndim)

# nbytes  返回一个整数,代表用于保存数据的字节数
print(d1.nbytes)

运行结果:
在这里插入图片描述


3、数组的索引和切片

数组索引

1、下标是整数
# 可以直接通过下标获取,而且这里面的数据可以被修改
n1 = np.array([1,2,34,5])
print(n1,'直接通过下标获取',n1[2],sep = '\n')
n1 = np.arange(20).reshape((4, 5))
print(n1, '直接通过下标获取', n1[2][1], sep = '\n')
print('也可以通过这种方式n1[1,2]', n1[1,2])

运行结果:
在这里插入图片描述

2、下标是列表
# 下标是一个列表,表示取第几行
n1 = np.logspace(2, 3, 12).reshape((3,4))
print(n1, '下标是一个列表', n1[[0, 2]], sep = '\n')

# 如果下标是一个二维列表
# [0, 2], [1, 1] 表示二维列表中第0行和第1列的元素
# 表示第2行和第1列的元素
# 是列表的0轴和1轴结合
print('下标[[0, 2], [1, 1]]', n1[[0,2], [1,1]], sep = '\n')

# 也可以利用下标是列表的情况来调换顺序,组成一个新的列表
print('利用下标是列表,来调换顺序,组成新列表', n1[[2,0,1]],sep = '\n')

# 列表中的元素可以重复,按照原来数组中的元素组成一个新的数组
print('列表中的元素可以重复,按照原来数组中的元素组成一个新的数组', n1[[2, 0, 0, 1]], sep = '\n')

在这里插入图片描述

3、下标是数组
# 下标是数组
# 数组的获取实际上和列表的获取是类似的
n1 = np.arange(12).reshape((3, 4))  # 二维列表
print(n1)
a = np.array([2, 0, 1])  # 数组里面的元素表示原数组的行数
print(n1[a])

# 一维列表
n1 = np.array([11, 22, 33, 44, 55])
# 下标是数组,按照数组中的元素值作为原数组的下标进行提取
print(n1[a])

# 以数组为下标的便捷之处
# 可以直接判断数组中的元素是几
# 举个例子,我要判断二维列表中的偶数
n2 = np.arange(12).reshape((3, 4))
print(n2)
check = n2 % 2 == 0
print(check)
# 根据这个作为原来二维数组的筛选条件
print(n2[check])

在这里插入图片描述

数组切片

# 数组切片
# 创建一维数组
n1 = np.arange(30, 50, 2)
print(n1)
print('切片处理', n1[2:8])

# 创建二维数组
n2 = np.arange(0, 60, 10).reshape(-1, 1) + np.arange(0, 6)
print(n2)
# 一个切片操作
print('一个切片操作,表示切分行数', n2[2:4], sep = '\n')
# 两个切片操作
# 第一个是代表0轴范围,第二个代表1轴范围,规定一个二维区域
print('两个切片操作', n2[1:3, 2:5], sep = '\n')
# 切片的start,stop,step和列表切片的三个量是一致的
print(n2[:3, 2:])
print(n2[::2, ::2])

在这里插入图片描述


4、数组的常用操作

np.reshapendarray.reshape
ndarray.shape
ndarray.flatten()ndarray.ravel

1、变形

reshape

# reshape()
n1 = np.arange(12).reshape((3,4))
print('直接在创建数组时就调用reshape', n1, sep ='\n')
n2 = np.arange(10)
n3 = np.reshape(n2, (2, 5))
print('创建了数组再调用reshape', n3, sep = '\n')

# 特殊情况
# 当不清楚有多少数据的时候,第一个值可以写-1,第二个值的数字控制列数
n4 = np.logspace(3, 4, 15).reshape(-1, 3)
print('reshape第一个参数是-1',n4, sep = '\n')

n5 = np.linspace(2, 10, num = 5).reshape(5,)
print(n5)
n6 = np.linspace(2, 10 ,num = 4).reshape((1, 4))
print(n6)

在这里插入图片描述
flatten()

# flatten()  变平
n7 = n6.flatten()
print(n7)

在这里插入图片描述

ravel()

# ravel()
n = np.arange(30, 18 , -2).reshape((2, 3))
print(n)
n8 = np.ravel(n)  # 扁平
print(n8)
n9 = np.array([[3,1,4], [5, 9, 0]])
n10 = n9.ravel()
print(n10)

在这里插入图片描述
使用切片来进行变形

# 通过切片来改变形状
n1 = np.arange(5)
print(n1)
print(n1[:, np.newaxis])
# np.newaxis相当于None
print(n1[::2, None])

在这里插入图片描述

2、组合

水平组合np.hstacknp.concatenate
垂直组合np.vstacknp.concatenate

注意:不论是水平组合还是垂直组合,都要保证对应的行列数是一致的,水平组合:两个数组的行数要一致;垂直组合:两个数组的列数要一致

水平组合

a = np.arange(9).reshape(3,3)
print(a)
b = np.arange(15).reshape((3, 5))
print(b)
# 使用np.hstack()进行水平组合
new = np.hstack((a,b))
print(new)
# 也可以使用np.concatenate进行轴的设置,实现水平组合
new1 = np.concatenate((a, b), axis = 1)
print(new1)

在这里插入图片描述

垂直组合

# 使用np.vstack()进行垂直组合
n1 = np.vstack((a, b.T))
print(n1)
# b.T的操作是将一个数组进行转置
print('转置前', b, sep = '\n')
print('转置后', b.T, sep = '\n')
# 使用np.concatenate进行垂直组合
n2 = np.concatenate((a, b.T), axis = 0)
print(n2)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3、分割

np.splitnp.hsplitnp.vsplit

np.split()
axis = 1 水平切割

n = np.arange(16).reshape(4, 4)
print('分割前', n , sep = '\n')

# 调用np.split()方法切割
res_n = np.split(n, 2, axis = 1)
print('使用np.split()切割,沿着1轴', res_n, sep = '\n')

在这里插入图片描述
np.hsplit()

#调用np.hsplit()进行水平切割
res_n = np.hsplit(n, 2)
print('使用np.hstack()水平切割', res_n, sep = '\n')

在这里插入图片描述

np.vsplit()
垂直切割

# 调用np.vsplit()垂直切割
res_n = np.vsplit(n, 2)
print('使用np.vsplit()垂直切割', res_n, sep = '\n')

在这里插入图片描述


5、数组运算

1、四则运算

# 一维数组四则运算
a = np.arange(3)
print('数组a', a)
b = np.array([3, 4, 5])
print('数组b', b)
# 事例:加法
# 其他运算同理
a = a + 10
print('数组a加10', a)
b = a + b
print('数组a+数组b', b)
a = a ** 2
print('数组a平方', a)

在这里插入图片描述
一维数组与二维数组运算
相当于一个广播

# 一维数组与二维数组运算
a = np.arange(5)
b = np.arange(10).reshape(2, 5)
print('数组a', a)
print('数组b', b, sep = '\n')
# a + b
print('数组a+数组b', a+b, sep = '\n')

在这里插入图片描述

b = np.arange(10).reshape(2, 5)
print('数组b', b, sep = '\n')
c = np.arange(2, 4).reshape(-1, 1)
print('数组c', c, sep = '\n')
# 数组b+数组c
print('数组b+数组c', b+c, sep = '\n')

在这里插入图片描述

2、比较运算

需要注意的是,在做数组比较的时候,两个数字的形状要一致

a = np.array([3, 6, 0])
b = np.array([4, 2, 9])
print('数组a、数组b做比较运算', a > b, sep = '\n')

在这里插入图片描述

3、逻辑运算

由于numpy是python中的一个库,所以逻辑运算不能直接使用python 中的and、or、not了
要换成logical_or、logical_and、logical_not

a = np.array([True, False])
b = np.array([False, True])
res = np.logical_or(a, b)
print('logical_or的结果', res)
res1 = np.logical_and(a, b)
print('logical_and的结果', res1)
res2 = np.logical_not(a)
print('logical_not的结果', res2)

在这里插入图片描述
如果想要实现a < b and b > a类似这种操作的内容
可以使用np.any()或者np.all()

np.any()
np.all()
a = np.array([3, 8, 0])
b = np.array([4, 6, 3])
res1 = np.any(a<b)
print('只要满足一个a<b,那么就返回True:np.any()', res1, sep = '\n')
res2 = np.all(a>b)
print('所有的元素都满足a>b,才会返回True:np.all()', res2, sep = '\n')
res3 = np.any(a<b) and np.all(a<b)
print(res3)
res4 = np.any(a<b) or np.all(a<b)
print(res4)

在这里插入图片描述


6、数组的通用函数

函数名称解释
np.sin; np.cos; np.tan三角函数
np.arcsin; np.arccos; np.arctan反三角函数
np.sinh; np.cosh; np.tanh双曲三角函数
np.arcsinh; np.arccosh; np.arctanh反双曲三角函数
np.sqrt求平方根
np.exp计算自然指数
np.log; np.log2; np.log10计算对数(依次以e、2、10为底)
函数名称(二元函数)解释
np.add; np.subtract; np.multiply; np.divide算数运算函数
np.equal; np.not_equal; np.less; np.less_equal; np.greater; np.greater_equal比较运算函数
np.power指数运算
np.remainder得到余数
np.reciprocal返回倒数(不能使用整数型)
np.real; np.imag; np.conj复数的实部、虚部和完整的复数
np.sign; np.abs得到对象符号和绝对值
np.floor; np.ceil; np.rint效果都是取整
np.round四舍五入

np.sin为例
利用matplolib绘制一个正弦函数
代码如下:

import matplotlib.pyplot as plt
import numpy as np

alpha = np.linspace(-1, 1, num = 30)
res = np.sin(np.pi * alpha)
print(res)
plt.figure(figsize = (8, 6))
plt.plot(alpha, res)
plt.style.use('ggplot')
plt.show()

在这里插入图片描述

通用函数有很多,但是有的时候我们需要自己写函数,而一般的函数在传参的时候是无法去处理数组的,这就需要我们进行一个转换了

例如一个处理BMI指数的函数
准备一个函数,但是在传参的时候两个参数是数组

def BMI(weight, height):
	res = weight / height ** 2
	if res >= 28:
		return 2
	elif 24 <= res <= 27.9:
		return 1
	elif 18.5 <= res <= 23.9:
		return 0
	elif res <= 18.4:
		return -1
w = (95 - 45) * np.random.random_sample(10, ) + 45
w = np.round(w, 2)
print(w)
h = (2.1 - 1.5) * np.random.random_sample(10, ) + 1.5
h = np.round(h, 2)
print(h)
res = BMI(w, h)
print(res)

这种情况下直接去运行的话是会报错的,没有办法处理数组
在这里插入图片描述

在这里插入图片描述
在这分别解释一下np.round()np.random.random_sample()
np.round()就是起到一个保留小数位的功能,第一个参数是数组,第二个参数是你想保留的位数
np.random.random_sample(),产生0-1之间的随机浮点数的数组,参数值代表生成的个数
在这里插入图片描述
解决方法:将这个函数转换成一个通用函数
使用np.frompyfunc()方法

frompyfunc(func, nin, nout)

Takes an arbitrary Python function and returns a NumPy ufunc.

Can be used, for example, to add broadcasting to a built-in Python
function (see Examples section).

Parameters
----------
func : Python function object
    An arbitrary Python function.
nin : int
    The number of input arguments.
nout : int
    The number of objects returned by `func`.

意思就是第一个参数是自己创建的python的函数,第二个参数是这个函数需要传入几个参数,第三个参数表示返回值个数是几个

def BMI(weight, height):
	res = weight / height ** 2
	if res >= 28:
		return 2
	elif 24 <= res <= 27.9:
		return 1
	elif 18.5 <= res <= 23.9:
		return 0
	elif res <= 18.4:
		return -1
w = (95 - 45) * np.random.random_sample(10, ) + 45
w = np.round(w, 2)
print('保留两位小数的体重', w)
h = (2.1 - 1.5) * np.random.random_sample(10, ) + 1.5
h = np.round(h, 2)
print('保留两位小数的身高', h)
res = np.frompyfunc(BMI, 2, 1)
res = res(w, h)
print('得出的结果',res)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值