首页 > 其他分享 >数据挖掘之numpy的使用

数据挖掘之numpy的使用

时间:2023-05-25 13:00:33浏览次数:51  
标签:67 print np 数组 使用 数据挖掘 array numpy

@[TOC](文章目录)

本文章是黑马程序员Python教程,4天快速入门Python数据挖掘,系统精讲+实战案例的学习笔记

数据挖掘之numpy的使用_数组

1. numpy简介

numpy是一个开源的Python科学计算库, 用于快速处理任意维度的数组

import numpy as np

data = np.array([[80, 89, 86, 67, 79],
                  [78, 97, 89, 67, 81],
                  [90, 94, 78, 67, 74],
                  [91, 91, 90, 67, 69],
                  [76, 87, 75, 67, 86],
                  [70, 79, 84, 67, 84],
                  [94, 92, 93, 67, 64],
                  [86, 85, 83, 67, 80]])

print(type(data))
print(data)

1.1 特点

存储风格

  • ndarray: 相同类型 - 通用行不强
  • list: 不同类型 - 通用行很强

并行化运算

  • ndarray支持向量化运算

底层语言

  • numpy底层使用C语言进行编写, 内部解除了GIL(全局解释器锁), 其对数组的操作速度不受Python解释器的限制, 效率远高于纯Python代码
import numpy as np
import random
import time

a = []
for i in range(100000000):
    a.append(random.random())

start1 = time.time()
print(sum(a))
end1 = time.time()
print(end1 - start1, "秒")   # 0.4297046661376953 秒

b = np.array(a)
start2 = time.time()
print(np.sum(b))
end2 = time.time()
print(end2 - start2, "秒")  # 0.12291550636291504 秒

1.2 ndarray的属性

  • shape: 数组维度的元组
  • ndim: 数组维数
  • size: 数组中元素的数量
  • dtype: 数组元素的类型
  • itemsize: 一个数组元素的长度(字节)
import numpy as np

data = np.array([[80, 89, 86, 67, 79],
                  [78, 97, 89, 67, 81],
                  [90, 94, 78, 67, 74],
                  [91, 91, 90, 67, 69],
                  [76, 87, 75, 67, 86],
                  [70, 79, 84, 67, 84],
                  [94, 92, 93, 67, 64],
                  [86, 85, 83, 67, 80]])

print(data.shape)     # (8, 5)
print(data.ndim)      # 2维数组
print(data.size)      # 40

print(data.dtype)     # int32
print(data.itemsize)  # 每个元素占用4字节
import numpy as np

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

b = np.array([1, 2, 3, 4])

c = np.array([[[1, 2, 3],
               [4, 5, 6]],

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

print(a.shape)  # (2, 3)
print(b.shape)  # (4,)
print(c.shape)  # (2, 2, 3)   这个三维数组可以看成是两个二维数组
import numpy as np

float_array = np.array([1.1, 2.2, 3.3])
print(float_array.dtype)   # float64

# 指定默认的类型 (下面两个都可以)
# q = np.array([1.1, 2.2, 3.3], dtype="float32")
q = np.array([1.1, 2.2, 3.3], dtype=np.float32)
print(q.dtype)   # float32

2. 基本操作

2.1 生成数组的方法

  • 生成0和1
  • np.zeros(shape)
  • np.ones(shape)
  • 从现有数组中生成
  • np.array() 或者 np.copy()
  • np.asarray() 当原数组更改时,新数组也会随之变化
  • 生成固定范围的数组
  • np.linspace(0, 10, 100) 范围: [0, 10],等距离100个元素
  • np.arange(0, 10, 5) 范围: [0, 10),步长为5,即只有两个元素0和5
  • 生成随机数组 (查看分布状况: 直方图)
  • 均匀分布 (每组的可能性相等)
  • 正态分布
import numpy as np

# 指定形状的时候, ()或[]都可以
a = np.zeros([2, 3])
print(a)

b = np.ones((2, 3))
print(b)
import numpy as np

# 从现有数组中生成
score = np.array([[80, 89, 86, 67, 79],
                  [78, 97, 89, 67, 81],
                  [90, 94, 78, 67, 74],
                  [91, 91, 90, 67, 69],
                  [76, 87, 75, 67, 86],
                  [70, 79, 84, 67, 84],
                  [94, 92, 93, 67, 64],
                  [86, 85, 83, 67, 80]])

data1 = np.array(score)
data2 = np.copy(score)
data3 = np.asarray(score)

# 下面两种写法是一样的
# 注意: np.asarray()相当于指针指向原数组, 当原数组发生改变时, 新数组也会改变
# score[3, 1] = 10000
score[3][1] = 10000

print(data1)
print(data2)
print(data3)  # 只有data3的数据发生了更改❗

下面是均匀分布和正态分布的示例

import numpy as np
import matplotlib.pyplot as plt

# 均匀分布
data1 = np.random.uniform(low=-1, high=1, size=10000000)

plt.figure(figsize=(20, 10), dpi=200)
plt.hist(data1, bins=1000)
plt.show()


# 正态分布               (平均值, 标准差, 生成的数量)
data2 = np.random.normal(loc=1.75, scale=0.1, size=10000000)

plt.figure(figsize=(20, 10), dpi=200)
plt.hist(data2, bins=1000)
plt.show()

数据挖掘之numpy的使用_正态分布_02

2.2 修改数组的形状

  • ndarray.reshape(shape) 返回新的ndarray, 原始数据没有变
  • ndarray.resize(shape) 没有返回值, 对原始的ndarray进行了修改
  • ndarray.T 转置: 行变列, 列变行
import numpy as np

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

b = a.reshape((1, 6))   # 则b为(1, 6), a数组不变
print(a)
print(b)

a.resize((3, 2))   # a数组发生了改变, 为(3, 2)
print(a)

c = a.T     # a不变, c变
print(c)
print(a)

2.3 类型的修改

  • ndarray.astype("int32") 更改数组的类型
  • ndarray.tobytes() 将数组序列化到本地 (把对象转化为可传输的字节序列过程称为序列化)
import numpy as np

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

f = temp.flatten()  # 将二维数组展平成一维数组
print(f)   # [1 2 3 4 3 4 5 6]

# 数组的去重
b = np.unique(temp)
print(b)   # [1 2 3 4 5 6]

3. 运算规则

3.1 逻辑运算

  • 布尔索引: arr[arr > 1] 选出数组中大于1的元素
  • 通用判断函数:
  • np.all() 只要有一个False就返回False, 只有全是True才返回True
  • np.any() 只要有一个True就返回True, 只有全是False才返回False
  • 三元运算符
  • np.where(arr > 0, 1, 0) 大于0置为1, 否则置为0
import numpy as np

arr = np.array([1, -1, 2, -2, 0.5])

# np.logical_and()表示逻辑相与
arr[np.logical_and(arr > 0, arr < 1)] = 100
print(arr)  # [  1.  -1.   2.  -2. 100.]

3.2 统计运算

  • 统计指标函数 (np.函数名 或者 ndarray.方法名 都是可以的)
  • max / min 最大值和最小值
  • mean 平均值
  • median 中位数
  • var 方差
  • std 标准差

按列取最大值 print(arr.max(axis=0)) 按行取最大值 print(np.max(temp, axis=1))

  • 返回最大值、最小值所在位置
  • np.argmax(arr, axis=0)
  • np.argmin(arr, axis=1)

3.3 数组间的运算

  • 数组与数的运算: arr + 1 表示数组的每一个元素都加1
  • 数组与数组运算:
  • 广播机制: numpy两个数组的相加、相减以及相乘都是对应元素之间的操作, 与矩阵相乘是不一样的。 当两个数组的形状并不相同的时候,我们可以通过扩展数组的方法来实现相加、相减、相乘等操作, 这种机制叫做广播(broadcasting)
  • 只有两个数组满足广播机制, 才可以进行相加相加、相减、相乘等操作
  • 当操作两个数组时, numpy会逐个比较它们的shape, 只有在下述情况下, 两个数组才能够进行数组与数组的运算:
  • 维度相等
  • shape其中相对应的一个地方为1
  • 运算结果的形状: 取两者的最大值
A        256×256×3
B                3
Result   256×256×3

A        9×1×7×1
B          8×1×5
Result   9×8×7×5

A        5×4
B          1
Result   5×4

A        15×3×5
B        15×1×1
Result   15×3×5

3.4 矩阵运算

矩阵matrix必须是二维的, 但是array可以是多维的 存储矩阵:

  • ndarray 二维数组
  • 矩阵乘法: np.matmul() 或者 np.dot() 或者 arr1 @ arr2
  • matrix 数据结构 np.mat() 将数组转换为矩阵类型

矩阵乘法:

  • (m, n) × (n, k) = (m, k)

3.5 合并与分割

  • 水平拼接 np.hstack((arr1, arr2))
  • 竖直拼接 np.vstack((arr1, arr2))
  • np.concatenate((arr1, arr2), axis=?) 当axis为0时, 表示竖直拼接 当axis为1时, 表示水平拼接

分割操作:

import numpy as np

x = np.arange(10, 19, 1)
print(x)  # [10 11 12 13 14 15 16 17 18]

# 表示将数组等分成3份 (若不能等分会报错)
a1, a2, a3 = np.split(x, 3)
print(a1)  # [10 11 12]
print(a2)  # [13 14 15]
print(a3)  # [16 17 18]

# 而array_split可以不等分
b1, b2 = np.array_split(x, 2)
print(b1)  # [10 11 12 13 14]
print(b2)  # [15 16 17 18]

# 若参数是列表, 表示按索引进行分割, 对应数组的下标为左闭右开❗
c1, c2, c3, c4 = np.split(x, [2, 5, 7])  # [10 11 12 13 14 15 16 17 18]
print(c1)  # [10 11]
print(c2)  # [12 13 14]
print(c3)  # [15 16]
print(c4)  # [17 18]

3.6 IO操作与数据处理

不建议使用numpy进行数据的读取, 因为不方便处理缺省值 data = np.genfromtxt("test.csv", delimiter=",")

# 原数据
id,value1,value2,value3
1,123,1.4,23
2,110,,18
3,,2.1,19

# 输出
[[  nan   nan   nan   nan]
 [  1.  123.    1.4  23. ]
 [  2.  110.    nan  18. ]
 [  3.    nan   2.1  19. ]]

标签:67,print,np,数组,使用,数据挖掘,array,numpy
From: https://blog.51cto.com/u_16057418/6346659

相关文章

  • CPPCheck 安装使用
    直接通过命令行安装:sudoapt-getinstallcppcheck通过下载源码包安装,比如2.10版本:1.登录http://cppcheck.net/下载2.10版本soucecode并解压2.cdcppcheck-2.10&&mkdirbuild&&cdbuild3.cmake..可能报错:NOCMAKE_CXX_COMPILERcouldbefoundSo......
  • macos 7z 使用
    在MacOS系统中,可以通过homebrew安装7zip,并在命令行中使用7z来压缩并加密文件。具体命令如下:1.安装7zip:```brewinstallp7zip```2.压缩并加密文件:```7za-p[密码]-mx=[压缩级别][压缩文件名].7z[待压缩文件或目录名]```例如:```7za-p123456-mx=9test.7z/Users/use......
  • 使用react-flow制作流程图
    1.react-flow react-flow是一个用于构建基于节点的应用程序的库。这些可以是简单的静态图或复杂的基于节点的编辑器。同时react-flow支持自定义节点类型和边线类型,并且它附带一些组件,可以查看缩略图的MiniMap和悬浮控制器Controls.2.react-flow安装npminstallreac......
  • Elasticsearch之join关联查询及使用场景 | 京东云技术团队
    在Elasticsearch这样的分布式系统中执行类似SQL的join连接是代价是比较大的,然而,Elasticsearch却给我们提供了基于水平扩展的两种连接形式。这句话摘自Elasticsearch官网,从“然而”来看,说明某些场景某些情况下我们还是可以使用的一、join总述1、关系类比在关系型数据库中,以MySQL为......
  • C#使用词嵌入向量与向量数据库为大语言模型(LLM)赋能长期记忆实现私域问答机器人落地
    ------------恢复内容开始------------在上一篇文章中我们大致讲述了一下如何通过词嵌入向量的方式为大语言模型增加长期记忆,用于落地在私域场景的问题。其中涉及到使用openai的接口进行词嵌入向量的生成以及chat模型的调用由于众所周知的原因,国内调用openai接口并不友好,所以今......
  • 一篇文章解密 - 如何在MyEclipse中使用JavaScript编写代码?
    MyEclipsev2022.1.0正式版下载MyEclipse技术交流群:742336981欢迎一起进群讨论JavaScript项目在MyEclipse2021及更高版本中,JavaScript支持对大多数JavaScript源代码都是开箱即用的——不需要特殊的JavaScriptEclipse项目或JavaScriptfacet。但是,我们建议使用jscon......
  • .NET中使用redis
    NuGet中安装对应的redis操作工具:StackExchange.Redis redis帮助类: ///<summary>   ///Redis读写帮助类   ///</summary>   publicclassRedisHelper   {       privatestringRedisConnectionStr=ConfigurationManager.AppSettings["RedisC......
  • 火山引擎DataTester:如何使用A/B测试优化全域营销效果
     当前,营销技术步入了全渠道、全周期的全域时代,随着广泛的数据积累,数据科学技术在营销领域发挥着越来越重要的作用,从消费者人群洞察到智能化信息广告投放,营销的提效让企业得以在转化的每个环节提升影响力,拓展营销的可能性。本文以火山引擎A/B测试(DataTester)应用为例,讲述在企业在......
  • java函数式编程stream流操作lambda表达式使用方法引用用法等练习
    java函数式编程stream流操作lambda表达式使用方法引用用法等练习 @Testvoidtest01(){System.out.println("111");List<Author>authors=getAuthor();//stream流打对象中一个字段authors.stream().distinct().forEach(author......
  • Linux系统,使用PHP连接ORACLE数据库
    首先安装ORACLE的InstantClient环境:在这里下载因为我需要连接11.2.0.4.0版本的ORACLE数据库,所以选取下载了basic-11.2.0.4.0-1.x86_64.rpm和devel-11.2.0.4.0-1.x86_64.rpm,使用如下命令安装:rpm-ivhoracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpmrpm-ivhoracle......