numpy

本文详细介绍了numpy库在Python中的使用,包括数组创建、数据类型、轴的理解、数组操作如转置、索引切片、数值修改、数组拼接、行列交换,以及常用的统计函数如求和、均值、中值、最大值、最小值等。同时讲解了布尔索引、缺失值处理和深浅拷贝的概念,并通过实例展示了numpy在实际问题中的应用。

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

list 相当于 特殊的数组
数组和列表的区别:

  • 数组: 存储的时同一种数据类型;
  • list: 容器, 可以存储任意数据类型;

numpy

  • 什么numpy?
    • 快速, 方便的科学计算基础库(主要是数值的计算, 多维数组的运算);
  • numpy的数据类型
    在这里插入图片描述
  • 轴的理解(axis): 0轴, 1轴, 2轴
    • 一维数组: [1,2,3,45] ----0轴
    • 二维数组: [[1,2,3,45], [1,2,3,45]] ----0轴, 1轴
      在这里插入图片描述
      在这里插入图片描述
1. numpy操作
  1. numpy创建数组(矩阵)?

    a = np.array([1,2,3,4,5])
    c1 = np.array(range(1,6))
    c2 = np.arange(1,6)

    创建三行四列的二维数组

    b=np.arange(12).reshape(3,4]

    print(type(c1))

    查看数据元素的类型

    print(c1.dtype)

    修改数组的数据类型

    print(c1.astype(‘float’))
    print(c1.astype(‘bool’))
    print(c1.astype(’?’)) # ?是bool类型的代号;

    创建的时候指定数据类型

    print(np.array([1,2,3,4], dtype=np.float))

    两个数组元素像加

    print(a+b) #[ 2 4 6 8 10]

    创建一个全为0的数组;

    print(np.zeros((3, 3), dtype=np.int))

    创建一个全为1的数组;

    print(np.ones((3, 4)))

    创建一个对角线全为1的正方形数组(方阵)

    print(np.eye(3))

  2. numpy数组的转置

    1).
    print(data.transpose())
    2). 0轴 , 1 轴
    print(data.swapaxes(1, 0))
    3).
    print(data.T)

  3. numpy的索引和切片

  • 数组的切片是原始数组的视图,这意味着数据不会被复制,视图上的任何修改都会直接反映到源数组上
    在这里插入图片描述
    取第一行的数据

    print(data[0])

    取第一列的数据

    print(data.T[0])
    print(data[:, 1])

    获取多行

    print(data[:2])

    获取多列

    print(data.T[:2])
    print(data[:, :2])

    获取指定行的前几列;

    print(data[[0,2], :2])

    获取指定列的前几行

    print(data[:2, [0,2]])

    在这里插入图片描述

  • 花式索引
    在这里插入图片描述
    花式索引将数据复制到新数组中

  1. numpy中数值的修改
    布尔索引: 复杂的条件: data中所有大于8的数字都替换为0;

    data = np.arange(12).reshape((3, 4))
    print(data>8)# 返回一个三行四列的数组, 存储的是Bool值
    data[data>8] = 0

    复杂的条件: data中所有大于8的数字都替换为0, 否则替换为1

    print(np.where(data <= 8, 1, 0))

  2. 数组的拼接
    竖直拼接(vertically)

    print(np.vstack((t1, t2, t3)))

    水平拼接(horizontally)

    print(np.hstack((t1, t2, t3)))

  3. 数组的行列交换
    行交换(第一行和第二行进行交换)

    t4[[0, 1], :] = t4[[1, 0], :]

    列交换(第3列和第5列进行交换)

    t4[:, [2, 4]] = t4[:, [4, 2]]

  4. numpy常用的方法
    获取数组里面最大值的索引;

    max_item1 = np.argmax(data)
    print(max_item1)

    获取每一列的最大值对应的索引;

    print(np.argmax(data, axis=0))

    获取每一行的最大值对应的索引;

    print(np.argmax(data, axis=1))

  5. numpy的深拷贝和浅拷贝
    列表的深拷贝和浅拷贝

    • 浅拷贝: a= b[::] a = copy.copy(b)
    • 深拷贝: a = copy.deepcopy(b)

    numpy中的拷贝

    • data1 = data: 完全不复制, 两个变量相互影响, 指向同一块内存空间;
    • data2 = data[::], 会创建新的对象data2,
      但是两个的数据变化是一致的;其中一个变了,另一个也会变
    • data3 = data.copy(), 深拷贝, 两个变量不互相影响;
  6. numpy中的nan和inf
    nan(not a number): 表示不是一个数字, 代表的是数据缺失
    inf(infinity): inf代表正无穷
    -inf代表负无穷

  • nan的特殊属性:
    • 两个nan的值是不相等的, 是float类型:

      *>>>np.nan == np.nan
      False
      *>>> np.nan != np.nan
      True
      *>>> type(np.nan)
      <class ‘float’>

    • 缺失值
      判断data里面的缺失值

      np.isnan(data)#返回值为bool的数组
      data!=data#返回值为bool的数组

      判断有多少个缺失值

      np.count_nonzero(data!=data)
      np.count_nonzero(np.isnan(data))
      np.isnan(data).sum()

      判断缺失值的位置

      np.where(np.isnan(data))

  1. numpy的常用统计函数
  • 求和

    print(data.sum())

    每一列数据的和;

    print(data.sum(axis=0))

    每一行数据的和;

    print(data.sum(axis=1))

  • 均值

    print(data.mean())
    print(data.mean(axis=0))
    print(data.mean(axis=1))

  • 中值

    print(np.median(data))
    print(np.median(data, axis=0))
    print(np.median(data, axis=1))

  • 最大值

    print(data.max())
    print(data.max(axis=0))
    print(data.max(axis=1))

  • 最小值

  • 极差

    print(np.ptp(data))
    print(np.ptp(data, axis=0))
    print(np.ptp(data, axis=1))

  • 标准差: 代表的是数据的波动稳定情况, 数字越大, 越不稳定;

    print(data.std())
    print(data.std(axis=0))
    print(data.std(axis=1))

  1. 两个小例子
    1.学生身高体重统计分析案例
    需求1:
    获取所有男生的身高平均值;获取所有女生的身高平均值;并绘制柱状图显示
import numpy as np
from pyecharts import  Bar
fname = "eg6-a-student-data.txt"
dtype = np.dtype([('gender', '|S1'), ('height', 'f2')])

#---------------------------------------知识点-------------------------------------------
# fname: 文件的名称, 可以是文件名, 也可以是ugz或者bz2的压缩文件;
# dtype: 数据类型, 可选, 默认是float;
# delimiter: 分隔符字符串, 默认情况是任何的空格,
# skiprows: 跳过前xx行, 一般情况跳过第一行;
#  usecols: 读取指定的列, 可以是元组;
# unpack: 如果为True, 对返回的数组对象转置;

data = np.loadtxt(fname=fname, dtype=dtype, skiprows=9,usecols=(1, 3))
# 判断是否性别为男的表达式
isMale = data['gender'] == b'M'

male_avg_height = data['height'][isMale].mean()
female_avg_height = data['height'][~isMale].mean()

bar = Bar(title="不同性别身高的平均值")
bar.add("", ["男", '女'], [male_avg_height, female_avg_height])
bar.render()

eg6-a-student-data.txt文件中的内容


需求2:
获取所有男生的体重, 求平均值;获取所有女生的体重, 求平均值;并绘制柱状图显示

def parser_weight(weight):
    # 对于体重数据的处理, 如果不能转换为浮点数据类型, 则返回缺失值;
    try:
        return  float(weight)
    except ValueError as e:
        return  -99

fname = "eg6-a-student-data.txt"
dtype = np.dtype([('gender', '|S1'), ('height', 'f2'), ('weight', 'f2')])
data = np.loadtxt(fname=fname, dtype=dtype, skiprows=9,
                  usecols=(1, 4), converters={4:parser_weight})

# 判断是否性别为男
isMale = data['gender'] == b'M'
male_avg_height = data['height'][isMale].mean()
female_avg_height = data['height'][~isMale].mean()

# 判断体重是否大于0
is_weight_vaild =  data['weight'] > 0
male_avg_weight = data['weight'][isMale & is_weight_vaild].mean()
female_avg_weight = data['weight'][~isMale & is_weight_vaild].mean()



bar = Bar(title="不同性别体重身高的平均值")
bar.add("身高", ["男", '女'], [male_avg_height, female_avg_height])
bar.add("体重", ["男", '女'], [male_avg_weight, female_avg_weight])
bar.render()

nunpy的小练习

题目:

1. 创建一个 5x5 的二维数组,其中边界值为1,其余值为0;
    - np.ones()
    - 切片和索引的赋值


2. 使用数字 0 将一个全为 1 的 5x5 二维数组包围, 效果如下:
array([[0., 0., 0., 0., 0., 0., 0.],
       [0., 1., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1., 1., 0.],
       [0., 0., 0., 0., 0., 0., 0.]])




3. 创建一个 10x10 的二维数组,并使得 1 和 0 沿对角线间隔放置, 效果如下:
array([[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
       [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
       [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
       [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
       [0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]])




4. 创建一个 0-10 的一维数组,并将 (1, 9] 之间的数全部反转成负数,  效果如下:
array([ 0,  1, -2, -3, -4, -5, -6, -7, -8, -9, 10])



5. 创建一个 5x5 的矩阵,其中每行的数值范围从 1 到 5, 效果如下:
array([[1., 2., 3., 4., 5.],
       [1., 2., 3., 4., 5.],
       [1., 2., 3., 4., 5.],
       [1., 2., 3., 4., 5.],
       [1., 2., 3., 4., 5.]])



6. 创建一个长度为 5 的一维数组,并将其中最大值替换成 0



7. 将二维数组的前两行进行顺序交换, 效果如下:
- 交换前
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]

- 交换后
[[ 5  6  7  8  9]
 [ 0  1  2  3  4]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]


8. 找出给定一维数组中非 0 元素的位置索引


9.找出数组中缺失值的总数及所在位置, 案例如下:
array([[0.8 , 0.25, 0.74, 0.05, 0.24, 0.16, 0.63, 0.62, 0.89, 0.85],
       [0.61, 0.76, 0.26, 0.3 , 0.82, 0.74, 0.96, 0.64, 0.58, 0.06],
       [0.78, 0.38, 0.19, 0.68, 0.75, 0.91, 0.13, 0.24, 0.98, 0.21],
       [0.47, 0.12, 0.34, 0.06, 0.46, 0.69, 0.1 ,  nan, 0.27, 0.92],
       [0.83, 0.01, 0.63, 0.15, 0.52, 0.52, 0.02, 0.  , 0.74, 0.59],
       [0.56, 0.66, 0.15,  nan, 0.26, 0.88, 0.15, 0.57, 0.61, 0.35],
       [0.33, 0.58, 0.06, 0.94, 0.58, 0.53, 0.97, 0.02, 0.32,  nan],
       [0.84, 0.71, 0.65, 0.42, 0.44, 0.96, 0.37, 0.65, 0.6 , 0.17],
       [0.04, 0.94, 0.92,  nan, 0.7 , 0.38, 0.28, 0.45, 0.35, 0.93],
       [0.38, 0.69, 0.43, 0.01, 0.67, 0.46, 0.73, 0.99, 0.94, 0.45]])
缺失值总数: 
 4
缺失值索引: 
 (array([3, 5, 6, 8]), array([7, 3, 9, 3]))


答案:

import random

import numpy as np
from numpy import nan

# # #1.
# data=np.ones((5,5))
# data[1:4,1:4]=0
# print(data)
#
# # 2.
# data=np.ones((5,5))
# data[[0,4],:]=0
# data[:,[0,4]]=0
# print(data)
#3.
data=np.ones((10,10))
data[:,1::2]=0
data[0::2,:]=data[9::-2,::-1]
print(data)
# #4.
# data=np.arange(10)
# data[1:]=0-data[1:]
# print(data)
# #5.
# data=np.array([1,2,3,4,5]*5).reshape(5,5)
# print(data)
# # 6
# data=np.array([random.randint(1,101) for i in range(5)])
# data[np.argmax(data)]=0
# print(data)
#
print('------------7-------------')
data=np.arange(25).reshape(5,5)
print(data)
data[[0,1],:]=data[[1,0],:]
print(data)
#
# print('-----------------8------------------')
# data=np.array([1,4,0,5,0,4])
# # print([i for i in range(len(data)) if data[i]!=0 ])
# print(np.where(data[:]!=0))
#
print('-------9---------------------')
data=np.array([[0.8 , 0.25, 0.74, 0.05, 0.24, 0.16, 0.63, 0.62, 0.89, 0.85],
       [0.61, 0.76, 0.26, 0.3 , 0.82, 0.74, 0.96, 0.64, 0.58, 0.06],
       [0.78, 0.38, 0.19, 0.68, 0.75, 0.91, 0.13, 0.24, 0.98, 0.21],
       [0.47, 0.12, 0.34, 0.06, 0.46, 0.69, 0.1 , nan, 0.27, 0.92],
       [0.83, 0.01, 0.63, 0.15, 0.52, 0.52, 0.02, 0.  , 0.74, 0.59],
       [0.56, 0.66, 0.15,  nan, 0.26, 0.88, 0.15, 0.57, 0.61, 0.35],
       [0.33, 0.58, 0.06, 0.94, 0.58, 0.53, 0.97, 0.02, 0.32,  nan],
       [0.84, 0.71, 0.65, 0.42, 0.44, 0.96, 0.37, 0.65, 0.6 , 0.17],
       [0.04, 0.94, 0.92,  nan, 0.7 , 0.38, 0.28, 0.45, 0.35, 0.93],
       [0.38, 0.69, 0.43, 0.01, 0.67, 0.46, 0.73, 0.99, 0.94, 0.45]])

print('缺失值总数',np.count_nonzero(data!=data))
print('缺失值总数',np.count_nonzero(np.isnan(data)))
print('缺失值总数',np.isnan(data).sum())
print(np.where(np.isnan(data)))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值