ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

《利用Python进行数据分析》第四章:NumPy_数组与向量化计算 知识点总结

2021-05-15 19:30:25  阅读:125  来源: 互联网

标签:知识点 arr Python data random 数组 np array NumPy


文章目录


导入NumPy: import numpy as np

4.1 NumPy ndarray:多维数组对象

ndarray:快速、灵活的大型数据集容器,使用类似标量的操作语法在整块数据上进行计算。

import numpy as np
# Generate some random data
data = np.random.randn(2, 3)
data
#array([[ 0.94900778,  0.59476419,  0.56584998],
#       [-1.78173004,  1.73499177,  0.13791552]])
data * 10
data + data

ndarray是多维 同类数据 容器,它包含的每个元素均为相同类型。

属性:

  • shape:表征数组每一维度的数量
  • dtype:数组的数据类型
  • ndim:数组的维度
data.shape
#(2,3)
data.dtype
#dtype('float64')
data.ndim
#2

创建

#array函数:转换序列型对象为ndarray
data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]
arr2 = np.array(data2)

#其他函数
np.ones(10)
np.zeros((3, 6))
np.empty((2, 3, 2))
np.arange(15)

详见P91

ndarray的数据类型

所有数据类型详见P93

可以在创建数组时显示指示数据类型:

arr1 = np.array([1, 2, 3], dtype=np.float64)
arr2 = np.array([1, 2, 3], dtype=np.int32)

可以使用astype函数显示转换数组的数据类型:

arr = np.array([1, 2, 3, 4, 5])
float_arr = arr.astype(np.float64)
arr is float_arr
#False

#应用:将字符串转换为数字
numeric_strings = np.array(['1.25', '-9.6', '42'], dtype=np.string_)
numeric_strings.astype(float)

注意:astype函数总是产生一个新的数组

向量化:数组算术

向量化:利用简单数组表达式完成多种数据操作的任务,而无需写大量循环。

#在两个等尺寸数组之间的算术操作都是逐元素操作
arr = np.array([[1., 2., 3.], [4., 5., 6.]])
arr * arr
arr - arr

#带标量的算术操作:把计算参数传递给数组的每一个元素
1 / arr
arr ** 0.5

#同尺寸数组间的比较,会产生一个bool数组

不同尺寸的数组的操作,会用到广播特性。

基础索引与切片

一维数组:

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

区别于内建列表,数组的切片是原数组的视图。这意味着数据并不是被复制了,对于视图的任何修改都会反映到原数组上。如果想要数组切片的拷贝而不是视图,需要显式复制数组:arr[5:8].copy()

多维数组和一维数组类似:

arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
#索引
arr2d[0][2]
arr2d[0, 2]
#切片
arr2d[:2, 1:]
#array([[2, 3],
#       [5, 6]])

布尔索引

使用bool型的数组,可以对同 轴索引长度 的数组进行匹配。

生成的是原数组的拷贝

names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = np.random.randn(7, 4)
names
#['Bob' 'Joe' 'Will' 'Bob' 'Will' 'Joe' 'Joe']
data
#[[-0.35176035  0.29067726  0.01902966  0.168551  ]
# [-0.55648651  0.0288038   0.17654006  0.66681319]
# [-1.97881433 -0.1972809   1.48667916 -1.36503254]
# [-0.52698119 -0.90773183  0.283557   -0.19347636]
# [-0.582597   -0.48995296  1.84067452  0.33647134]
# [ 1.26790447 -0.90134568  0.49701361  0.81876599]
# [ 0.97068434 -0.33643127 -0.75268657  1.52906681]]

data[names == 'Bob']
#array([[-0.35176035,  0.29067726,  0.01902966,  0.168551  ],
#       [-0.52698119, -0.90773183,  0.283557  , -0.19347636]])

还可以用切片或整数值对bool数组进行混合和匹配。

data[names == 'Bob', 2:]
data[names == 'Bob', 3]

bool算数运算符

#取反
names != 'Bob'
data[~(names == 'Bob')]
#and& or|
mask = (names == 'Bob') | (names == 'Will')

神奇索引

使用整数数组对数据进行索引。

生成的是新的数组。

image-20210507201934927

如果使用负的索引,将从尾部选择。
image-20210507202022050

有多个 索引数组时,会根据每个索引元组对应的元素选出一个一维数组。
image-20210507202332736

如果是想获得多个 索引数组 所形成的矩阵,可以这样实现。

arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]
#array([[ 4,  7,  5,  6],
#       [20, 23, 21, 22],
#       [28, 31, 29, 30],
#       [ 8, 11,  9, 10]])

数组转置和换轴

转置返回的是底层数据的视图,不是拷贝。

#T属性
arr.T

#transpose函数
arr = np.arange(16).reshape((2, 2, 4))
arr
'''
[[[ 0  1  2  3]
  [ 4  5  6  7]]
 [[ 8  9 10 11]
  [12 13 14 15]]]
'''
arr.transpose((1, 0, 2))
'''
[[[ 0,  1,  2,  3],
  [ 8,  9, 10, 11]],
 [[ 4,  5,  6,  7],
  [12, 13, 14, 15]]]
'''
#arr[1][0][0]=8		->		arr[0][1][0]=8
#.T转置是换轴的特殊案例

#swapaxes函数:接受一对轴编号作为参数,交换这两轴。
#见下图
image-20210507203842925

4.2 通用函数:快速的逐元素数组函数

所有通用函数详见P107。

分为:

  • 一元通用函数
    sqrt,exp,……
  • 二元通用函数
    add,maximum,modf,……

4.3 使用数组进行面向数组编程

将条件逻辑作为数组操作:where方法

np.where是三元表达式x if condition else y的向量化版5本。

image-20210507205552446
#where的第2 3个参数并不需要是数组,它们可以是标量。
#应用:根据一个数组生成新的数组。
arr = np.random.randn(4, 4)
print(arr)
'''
[[ 0.55624077  1.24948354 -1.42920909 -0.69959311]
 [ 0.95779919  0.35392485  1.57142211 -0.40695931]
 [ 0.64367646  0.71305863  0.21575723 -0.72190439]
 [ 2.01123234 -0.15993325  0.68184634  0.29014394]]
'''
np.where(arr > 0, 2, -2)
'''
[[ 2,  2, -2, -2],
 [ 2,  2,  2, -2],
 [ 2,  2,  2, -2],
 [ 2, -2,  2,  2]]
'''

#还可以将标量和数组结合起来。
np.where(arr > 0, 2, arr) # set only positive values to 2

数学和统计方法

可以使用聚合函数统计数组数据,既可以直接调用数组实例的方法,也可以使用顶层的NumPy函数。

arr.mean() np.mean(arr)

所有 基础数组统计方法 详见P133

方法既可以对整个数组进行聚合,也可以接受一个axis,计算给定轴向上的统计值,形成一个下降一维的数组。

image-20210508214129043

注意axis参数和计算方向的对应关系。

any() all()

#应用:计算布尔值数组中True的个数
arr = np.random.randn(100)
(arr > 0).sum() # Number of positive values

#any():是否至少有一个True
#all():是否全是True
bools = np.array([False, False, True, False])
bools.any()
#True
bools.all()
#False

排序sort()

np.sort()返回的是新的排好序的数组。

#一维数组
arr = np.random.randn(6)
arr.sort()
'''
array([-1.29665142, -0.10679855,  0.84309949,  1.32614008,  1.47609033,
        2.00921709])
'''

#二维数组
arr = np.random.randn(5, 3)
'''
[[-0.21121688  0.99048294  0.17504805]
 [ 0.00350931  1.12237161 -0.07766287]
 [ 0.08693362 -0.22564583 -2.38200677]
 [ 0.19273262 -0.43494563  0.01190635]
 [-0.38512356  0.87033742 -1.1956684 ]]
'''
arr.sort(1)
'''
[[-0.21121688,  0.17504805,  0.99048294],
 [-0.07766287,  0.00350931,  1.12237161],
 [-2.38200677, -0.22564583,  0.08693362],
 [-0.43494563,  0.01190635,  0.19273262],
 [-1.1956684 , -0.38512356,  0.87033742]]
'''

unique()

对数组中唯一值排序后形成的数组。

ints = np.array([3, 3, 3, 2, 2, 1, 1, 4, 4])
np.unique(ints)
#array([1, 2, 3, 4])

in1d()

检查 一个数组中的值 是否在 另外一个数组中,并返回一个布尔值数组。

values = np.array([6, 0, 0, 3, 2, 5, 6])
np.in1d(values, [2, 3, 6])
#array([ True, False, False,  True,  True, False,  True])

4.5 线性代数

点乘

x.dot(y)
np.dot(x, y)
x @ np.ones(3)

numpy.linalg

numpy.linalg拥有一个矩阵分解的标准函数集,以及其他常用函数,例如求逆inv和行列式求解det等。

常用函数见P188。

4.6 伪随机数生成

相关函数见P119.

#nomal()
samples = np.random.normal(size=(4, 4))
#这样生成的是伪随机数,可以用np.random.seed更改随机数种子。
np.random.seed(1234)

#randn()
#numpy.randn()的 数据生成函数 使用 一个全局随机数种子。为了避免全局状态,可以使用np.random.RandomState创建一个随机数生成器,使数据独立于其他的随机数状态。
rng = np.random.RandomState(1234)
rng.randn(10)

标签:知识点,arr,Python,data,random,数组,np,array,NumPy
来源: https://blog.csdn.net/weixin_43689820/article/details/116860107

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有