Linking

Capturing Life & Tech

  • 主页
  • 随笔
  • 关于我
所有文章 外链

Linking

Capturing Life & Tech

  • 主页
  • 随笔
  • 关于我

《利用Python进行数据分析》读书笔记-4-第四章-Numpy基础:数组和矢量计算

阅读数:次 2017-03-14
字数统计: 2k字   |   阅读时长≈ 8分

Tip:全称Numerical Python,是高性能科学计算和数据分析的基础包。本书所有高级工具的构建基础。

NumPy功能

  • ndarry,矢量算术运算和复杂广播能力的快速切节省空间的多维数组
  • 对数组数据进行快速运算的标准数据函数(无需编写循环)
  • 读写磁盘的工具,,操作内存映射文件的工具
  • 线性代数、随机数生成以及傅立叶变换
  • 集成C、C++、Fortran等语言编写的代码(从生态系统角度,最重要的功能)

对于大部分数据分析应用,作者关注功能:

  • 数据整理和清理、子集构造和过滤、转换等快速矢量化数组运算
  • 数组算法,如排序、唯一化、集合运算
  • 高效描述统计和数据聚合/摘要运算
  • 异构数据集的合并/连接运算
  • 条件逻辑表述为数组表达式(除去if-else-if循环)
  • 数据分组运算

Tip:标准NumPy约定,总是使用import NumPy as np,而不是from NumPy import *.

ndarray: 一种多维数组对象

Tip:NumPy最重要特点是其N维数组对象(即ndarray,该对象是一个快速而灵活的大数据集容器)。

大多数数据分析工作不需要深入理解NumPy,但精通面向数组的编程和思维方式是成为Python科学计算牛人的一大关键步骤。

Focus:本书提到的数组、NUmPy数组、ndarray都是指ndarray对象

  • ndarray是同构数据多维容器,其中所有元素相同的类型。
  • 每个数组都有shape和dtype属性

创建ndarray

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/python
# -*- coding:utf-8 -*-

import numpy as np
# data = np.ndarraz([[0.580052,0.186730,1.040717],[-0.636917,-0.938659,0.124094]])
# print data.shape

data1 = [5,7,8,3,9]
arr1 = np.array(data1)
# print arr1
# print arr1.ndim # 1 维
# print arr1.shape # (5,)
# print arr1.dtype # int64

# print np.zeros(10)
# [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
# print np.zeros((3,6))
# [[ 0. 0. 0. 0. 0. 0.]
# [ 0. 0. 0. 0. 0. 0.]
# [ 0. 0. 0. 0. 0. 0.]]
# print np.empty((2,3,2))
# [[[ -2.00000000e+000 -2.00000000e+000]
# [ 6.95320070e-310 6.95320070e-310]
# [ 6.95320070e-310 6.95320070e-310]]
#
# [[ 6.95320070e-310 6.95320070e-310]
# [ 6.95320070e-310 6.95320070e-310]
# [ 6.95320070e-310 6.95320070e-310]]]
# np.empty经常返回一些为初始化的垃圾值
# print np.arange(10)
# [0 1 2 3 4 5 6 7 8 9]

Focus:如无特别指定,数据类型基本都是float64

ndarray的数据类型

ndarray的astype方法可转换其dtype:

1
2
3
4
5
6
arr = np.array([1,2,3,4,5])
print arr.dtype
# int64
float_arr = arr.astype(np.float64)
print float_arr.dtype
# float64

数组与标量之间运算

无需循环就可执行批量运算;这就叫做矢量化(vectorization)。不同大小数组之间的运算叫做广播。

1
2
3
arr = np.array([[1.,2.,3.], [4.,5.,6.]])
# print arr
# print arr * arr 加减乘除都是相对位置相乘

基本索引和切片

与列表最重要区别在于,数组切片是原始数组的视图。说明数据不会被复制,视图伤的任何修改都会直接反映到数组上。若非要复制,就要显式复制:arr[5:8].copy()

1
2
3
4
5
6
7
8
9
arr = np.arange(10)
# print arr[5:8] # [5,6,7]
arr[5:8] = 12
# print arr # [0 1 2 3 4 12 12 12 8 9]
arr_slice = arr[5:8]
arr_slice[1] =12345
print arr # [0 1 2 3 4 12 12345 12 8 9]
arr_slice[:] = 64
# print arr # [0 1 2 3 4 64 64 64 8 9]

切片索引

ndarray切片语法与一维对象相似。多维切片只是一维的基础山进行扩展。

沿着第0轴切片;切片是沿着一个轴向选取元素的。一次传入多个切片:

1
2
3
4
5
6
7
arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
# print arr2d[:2]
# out: [[1 2 3], [4 5 6]]
# print arr2d[:2,:1]
# out: [[1], [4]]
# print arr2d[:2,1:]
# out: [[2,3],[5,6]]

上面只能得到相同维数的数组视图。

通过将整数索引和切片混合,可以得到低维度的切片:

1
2
3
4
5
6
print arr2d[1,:2]
# out: [4, 5]
print arr2d[2:,1]
# out: [8]
print arr2d[:, :1]
# out: [[1], [4], [7]]

Focus::,冒号表示选取整个轴。

对切片表达式进行赋值,该操作会扩散到整个选区。

1
2
3
arr2d[:2, 1:] = 0
print arr2d
# out: [[1 0 0], [4 0 0], [7 8 9]]

布尔型索引

二维数组切片,第一个数字开始在行这个维度上切片,第二个数字在列上切片。

布尔型索引选取数组中多数据,总是创建数的副本,即使是返回一摸一样多数组。

⚠️:Python关键字and和or在布尔型数组中无效。

通过布尔型数组设置值,如下,将data中的所有负值都设为0:

1
data[data < 0] = 0

一维数组设置正行或列的值:

1
data[name != 'Joe'] = 7

花式索引

指利用整数数组进行索引;花式索引跟切片不一样,总是将数据复制到新数组中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
arr = np.empty((8,3))
for i in range(8):
arr[i] = i
# print arr
# out:[[ 0. 0. 0.]
# [ 1. 1. 1.]
# [ 2. 2. 2.]
# [ 3. 3. 3.]
# [ 4. 4. 4.]
# [ 5. 5. 5.]
# [ 6. 6. 6.]
# [ 7. 7. 7.]]

# print arr[[4,3,0,6]]
# out:[[ 4. 4. 4.]
# [ 3. 3. 3.]
# [ 0. 0. 0.]
# [ 6. 6. 6.]]

数组转置与轴对换

1
2
3
4
5
6
7
8
9
10
11
12
13
arrzzdh = np.arange(15).reshape(3,5)
# print arrzzdh
# out: 0-15个数字 转换成3行5列的数组
# [[ 0 1 2 3 4]
# [ 5 6 7 8 9]
# [10 11 12 13 14]]
print arrzzdh.T
# out: 转置,行列倒置
# [[ 0 5 10]
# [ 1 6 11]
# [ 2 7 12]
# [ 3 8 13]
# [ 4 9 14]]

利用数组进行数据处理

用数组表达式代替循环的做法,称为矢量化。

1
2
3
4
5
6
7
8
9
points = np.arange(-5,5,0.1) # 1000个间隔相等的点
xs, ys = np.meshgrid(points, points)
# print ys
import matplotlib.pyplot as plt
z = np.sqrt(xs**2 + ys**2)
# print z
plt.imshow(z, cmap=plt.cm.gray);plt.colorbar()
plt.title("Image plot of $\sqrt{x^2 + y^2}$ for a grid of values")
plt.show()

将条件逻辑表述为数组运算

如numpy.where函数是三元表达式x if condition erse y的矢量化版本。

1
result = np.where(condition="",x="",y="")

满足条件则x,否则y

数学和统计方法

1
2
3
4
5
6
7
arr = np.random.randn(5, 4)
print arr.mean()
# out: -0.360180571527

arr = np.random.randn(100)
print (arr > 0).sum()
# out: 随机的一百个数字,每次大于0的数的个数。
1
2
3
4
5
6
7
8
9
10
11
12
## 排序
arr1 =np.random.randn(8)
print arr1
arr1.sort()
# 先sort排序,才能输出,如果直接同时输出排序,会None
print arr1

# 多维数组排序,在任何一个轴上,传入该轴编号即可
arr2 = np.random.randn(5,3)
print arr2
arr2.sort(1)
print arr2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
## 唯一化
names = np.array(['jin', 'king', 'lin', 'wen', 'jin', 'wen', 'lin'])
# print np.unique(names) # 这里又必须直接输出
# print names # 无效
ints = np.array([2,3,4,5,6,7,8,5,4,2,4,6,1])
# print np.unique(ints) # 直接输出有效
# print ints # 无效
# # 没效果?那么纯Python方法有效果吗
# print sorted(set(names))
# print names
# print sorted(set(ints))
# print ints
# 还是没有效果啊
# 这里说明排序唯一都要直接输出,**原值没有改变**。
1
2
3
4
5
6
7
8
9
10
11
12
13
## 用于数组的文件输入输出
### 将数组以二进制格式保存到硬盘
# np.save()和np.load()方法是用于读写的主要方法。
arr3 = np.arange(10)
np.save('test_arr_save', arr3)
# 保存为了.npy文件;然后用load方法读取数组
# print np.load('test_arr_save.npy')
# out: [0 1 2 3 4 5 6 7 8 9]
# np.savez保存多个数组到压缩文件
np.savez('arr_archive.npz', a= arr3, b=arr3)
arch = np.load('arr_archive.npz')
# print arch['b']
# out: [0 1 2 3 4 5 6 7 8 9]
1
2
3
# 存取文本文件
# 指定分隔符为逗号,读取csv文件
# np.loadtxt('filename', delimiter=',')

最后涉及到了线性代数,随机漫步等数学概念,深切体会到学好数学是任何一门科学想要往高了走的必然阶梯,计算机科学当然也不例外。

今天组内培训,讲了一些代码规范、版本更新和项目管理的知识,无规矩不成方圆,团队大了,尤其需要一套行之有效的规矩来约束每个人的行为,代码能体现一个人的行为方式,是否有代码洁癖。Talk is cheap, show me the code.希望组内能坚持下去,互相code Review。

  • 本文作者: Linking
  • 本文链接: https://linking.fun/2017/03/14/《利用Python进行数据分析》读书笔记-4-第四章-Numpy基础:数组和矢量计算/
  • 版权声明: 版权所有,转载请注明出处!
  • Python
  • cs

扫一扫,分享到微信

《利用Python进行数据分析》读书笔记-第五章-pandas入门
《利用Python进行数据分析》读书笔记-3-第三章-IPython:一种交互式计算和开发环境
  1. 1. NumPy功能
  2. 2. ndarray: 一种多维数组对象
    1. 2.1. 创建ndarray
    2. 2.2. ndarray的数据类型
  3. 3. 数组与标量之间运算
  4. 4. 基本索引和切片
  5. 5. 切片索引
  6. 6. 布尔型索引
    1. 6.1. 花式索引
    2. 6.2. 数组转置与轴对换
  7. 7. 利用数组进行数据处理
    1. 7.1. 将条件逻辑表述为数组运算
    2. 7.2. 数学和统计方法
© 2015-2026 Linking
GitHub:hexo-theme-yilia-plus by Litten
本站总访问量次 | 本站访客数人
  • 所有文章
  • 外链

tag:

  • weather
  • 需求
  • essay
  • basketball
  • olympic
  • nginx
  • APPScan
  • SQl盲注
  • xss
  • Ajax
  • ajax
  • ai
  • agent
  • openclaw
  • ccf
  • Nginx
  • HTML5
  • html5
  • hmtl5
  • sse
  • JavaScriptCore
  • Oracle
  • operation
  • Linux
  • deploy
  • Mac Office
  • markdown
  • ListView
  • GridView
  • MySQL
  • 慢查询
  • mongodb
  • 转置
  • thought
  • network
  • ubuntu
  • NetworkManager
  • RFKill
  • Netplan
  • avatar
  • cocoa
  • blog
  • Gitalk
  • container
  • macvlan
  • docker
  • oracle
  • cookie
  • patch
  • gitea
  • git
  • iOS
  • https
  • 多线程
  • bundle
  • 兼容性
  • HTTP
  • 绘图
  • cs
  • java
  • 效率
  • 快捷键
  • route
  • nodejs
  • pip
  • arcgis
  • arcgis 建模
  • 标识
  • redis
  • read
  • bookList
  • running
  • showdoc
  • disk
  • unit-test
  • D.Wade
  • thoughts
  • duoduo
  • Python
  • python
  • tomcat
  • 读书节
  • session
  • jdk
  • war
  • 加班
  • Android onclick事件监听
  • 正则
  • 手机品牌匹配
  • ntp
  • OpenLayers
  • Geoserver
  • wechat
  • 微信公众号
  • 爬虫
  • WeChat
  • 张靓颖
  • 动漫
  • vpn
  • PPT
  • MarkDown
  • plan
  • 朱赟
  • 极客时间专栏
  • 极客邦
  • 模块化
  • MVC
  • excel
  • NBA
  • kobe
  • team
  • crawler
  • 进度条
  • ssl
  • book
  • anti-stealing-link
  • Agentic Engineering
  • Vibe Coding
  • Software 3.0
  • Andrej Karpathy
  • LLM
  • Programming

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • GitHub Trending
  • OpenAI ChatGPT
  • Gitee码云
  • 简书
  • CSDN