Numpy 数组

创建数组 ndarray

所有元素为相同类型。

import numpy as np

# 接受一切序列型的对象
np.array()
# 数据类型
arr = np.array([1, 2, 3, 4, 5])
arr.dtype
arr1 = arr.astype(np.float64)
# 参数是一个表示数组形状的元组
np.zeros()
np.ones()
np.full((3, 4), 1) # full函数,创建任意大小的数组并填充任意数字

# 等差数列 一维
np.arange(5)
np.arange(3, 7) # 特定范围
# 多维
np.arange(6).reshape(2, 3)# 二维
# 单位矩阵
np.eye()

Numpy 中随机数的使用

# 随机数组
# 输入数组的大小,生成 [0, 1) 的数组
# 注意这里输入的形状不是以元组形式
np.random.rand(2, 3)
# 整数数组
np.random.randint(5, size = (2, 3)) # [0, 5)
np.random.randint(1, 5, size = (2, 3)) # [1, 5)
# Generate a 1 x 3 array with 3 different upper bounds
np.random.randint(1, [3, 5, 10])
np.random.randint([1, 5, 7], 10)

索引的使用

Numpy 中的数组索引与列表最重要的区别在于,直接赋值的数组切片是原始数组的视图,数据不会被复制,视图上的修改都会直接反映到原数组上。NumPy 在内部尽可能地共享内存,以提高性能。

a = np.array([[3, 8, 8],
              [5, 7, 3],
              [5, 6, 8]])
a[1, 2] 
# 3

# 切片
# 冒号表示所取的范围,跟列表的索引用法一样,
# 逗号用来区分每个维度
a[-2:, 1:3]
# array([[7, 3],
#        [6, 8]])

ls = np.array([1, 2, 3, 6, 8, 65, 43])
# 切片是视图
a = ls[2:5]
a  # [3 6 8]
a[0] = 99
ls 
# array([ 1,  2, 99,  6,  8, 65, 43])

# 使用 copy() 方法创建副本
a = ls.copy()
# 使用 copy 参数创建副本
a = np.array(ls, copy=True)

# array([ 1, 2, 12, 13, 34, 65, 43])

# 与 np.arange 活用
a[np.arange(3), 1] += 10 # 给a数组的第二列上的每个数加上10
a[[0, 1, 2], 1] += 10

布尔索引

布尔索引可以与切片、整数混合使用。要排除某值,可以使用 != 或者 ~ 符号对条件进行否定。

a[a > 10]

ans = a > 10
# array([[False,  True, False],
#        [False,  True, False],
#        [False,  True, False]])
a[ans] # array([18, 17, 16])
a[~(a <= 10)]

花式索引

Fancy indexing 指利用整数数组进行索引。花式索引将数据复制到新数组中。

arr = np.arange(18).reshape(6, 3)
# array([[ 0,  1,  2],
#        [ 3,  4,  5],
#        [ 6,  7,  8],
#        [ 9, 10, 11],
#        [12, 13, 14],
#        [15, 16, 17]])
arr[[4, 1]]
# array([[12, 13, 14],
#        [ 3,  4,  5]])
arr[[4, 1], [1, 2]]
# array([13,  5])
arr[[4, 1]][:, [1, 2]]]
# array([[13, 14],
#        [ 4,  5]])

数组的运算

求和与平均值的这类函数都有 axis 参数,指定进行计算的轴,返回的数组比原数组少一维。
cumsumcumprod 之类的函数返回与原数组同样大小的数组,每个低位的切片沿着指定轴计算部分聚类
若数组为布尔数组,则强转为 1 和 0。

'''二维数组:
axis=0, -2 轴为行
axis=1, -1 轴为列
负数就是倒着求
'''
a = np.array([[1, 2], [3, 4]])
a.sum()
a.mean()

# 平铺
np.tile(a, (1, 2)) # 将数组a变成一行两列

# 排序
a.sort()
a.argsort() # 返回从小到大排序后的顺序

基本统计方法

方法说明
sum mean求和、求平均值
std var标准差、方差,自由度可调,默认为n
min max最小值、最大值
argmin argmax最小值与最大值的索引
cumsum cumprod元素累计和、积
a = np.arange(9).reshape(3, 3)
# array([[0, 1, 2],
#        [3, 4, 5],
#        [6, 7, 8]])
a.cumsum()
# array([ 0,  1,  3,  6, 10, 15, 21, 28, 36])
a.cumsum(0)
# array([[ 0,  1,  2],
#        [ 3,  5,  7],
#        [ 9, 12, 15]])
a.cumprod(1)
# array([[  0,   0,   0],
#        [  3,  12,  60],
#        [  6,  42, 336]])

# 数组中有没有True
b.any()
# 数组中有没有False
b.all()
# 唯一性
b.unique()

数组间的运算

# 相应位置上的运算
a + b
a - b
a * b
a / b

# 矩阵乘法
np.dot(A, B)
A.dot(B)
np.mat(A) * np.mat(B)
# 使用 np.mat 将二维数组准确定义为矩阵,就可以直接使用 * 完成矩阵乘法计算

# 转置
A.T
# 求逆
np.linalg.inv(A)

# 广播
a = np.array([[1, 2, 3],
             [4, 5, 6],
             [7, 8, 9]])
b = np.array([1, 2, 3])
# 直接写为a + b, 当参与运算的操作数的维度不一样时numpy自动实现广播功能
a + b # 相当于 a + np.tile(b, (3, 1))  在a的每一行都加上b

numpy.where

np.where 将三元表达式 x if condition else y 变成了矢量化版本。

x = np.random.randn(3, 3)
y = np.random.randn(3, 3)

# 创建一个布尔数组作为判断条件
z = np.random.randn(3, 3)
con = z > 0
# array([[False, False,  True],
#        [False, False,  True],
#        [False, False,  True]])

# con为True则x,否则y
# 此处的x,y可以大小不等,也可以为标量
res = np.where(con, x, y)

本文内容为《利用Python进行数据分析(第二版)》Numpy 部分的笔记。

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值