NumPy一小时速成

文章目录

1.为什么有数组list了还要用numpy?

数组list处理 小量数据 时性能尚可,大量数据 还得用numpy

list处理大量数据时占的空间大,速度慢

2.array规则

array即数组,有一维数组,二维数组,三维数组...

array在numpy中称为:ndarray,全称N-dimensional array

有三个规则:

  1. 数组中所有元素必须是相同类型。不像python中的数组list,里面的元素可以是不同类型
  2. 数组大小不能改变。比如创建了一个3 * 4的二维数组,它大小是12,你可以把它变成4 *3、1 * 12、12 * 1,但就是不能改变其大小
  3. 数组形状必须是矩形。比如创建一个对称矩阵,每个元素你都必须写出来,不能只写一半元素

3.常用操作

3.1创建数组

python 复制代码
import numpy as np

# 一维数组
a = np.array([1, 2, 3, 4, 5, 6]) 
# 输出维度
print(a.ndim)  # 1

# 二维数组
b = np.array([[1, 2, 3, 4, 5, 6]]) 
# 输出维度
print(b.ndim)  # 2

3.2一维数组索引+赋值+切片

从左到右,下标从0开始,依次是0、1、2...

从右到左,下标从-1开始,依次是...、-3、-2、-1

python 复制代码
import numpy as np

# 一维数组
a = np.array([1, 2, 3, 4, 5, 6])

print(a[0])  # 1
print(a[-1]) # 6
print(a[-2]) # 5

数组赋值

python 复制代码
a[0] = 10

print(a)  # [10  2  3  4  5  6]

数组切片:

python 复制代码
import numpy as np

a = np.array([7, 9, 8, 4, 5, 6])

# 取出下标0、1、2,不包括下标3
print(a[:3]) # [7 9 8]

# 全部取出来
print(a[:]) # [7 9 8 4 5 6]

# 除了最后一个,其余都取出来
print(a[:-1]) # [7 9 8 4 5]

# 隔2个数取一个
print(a[::2]) # [7 8 5]

3.3二维数组取值

逗号前管行,逗号后管列

python 复制代码
import numpy as np

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

# [[7 9 8 4]
#  [1 2 3 4]
#  [4 5 6 7]]
print(a)


# 取出第0行第0列的数
print(a[0,0]) # 7
print(a[2,1]) # 5

# 取出第0行
print(a[0,]) # [7 9 8 4]
print(a[0,:]) # [7 9 8 4]

# 取出第0列
print(a[:,0]) # [7 1 4]

3.4数组的一些属性方法ndim+shape+size+dtype

python 复制代码
import numpy as np

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

# 查看几维数组
print(a.ndim) # 2
print(b.ndim) # 1

# 查看数组几行几列    特别注意一维数组的输出
print(a.shape) # (3, 4)
print(b.shape) # (6,)

# 查看数组有几个元素
print(a.size) # 12
print(b.size) # 6

# 查看数组中数据是什么类型
print(a.dtype) # int64
print(b.dtype) # int64

3.5创建数组常用函数zeros+ones+empty+arange+linspace

python 复制代码
import numpy as np

# 创建一维数组,里面有2个0
a = np.zeros(2)
print(a) # [0. 0.]
print(a.dtype) # float64

# 创建一维数组,里面有2个1
a = np.ones(2)
print(a) # [1. 1.]
print(a.dtype) # float64

aa = np.ones(2, dtype=np.int64)
print(aa) # [1 1]
print(aa.dtype) # int64

# 创建一维空数组,里面的元素不确定
b = np.empty(3)
print(b) # [7.58887356e-275 9.25252624e-312 9.25454752e-312]
print(b.dtype) # float64

# 从0开始创建到3,顾头不顾腚
a = np.arange(4)
print(a) # [0 1 2 3]

# 从2-10中创建,隔2个数创建一个,不包括10
a = np.arange(2, 10, 2)
print(a) # [2 4 6 8]

# 从0-10中创建等距的5个数,包括0和10
a = np.linspace(0, 10, 5)
print(a) # [ 0.   2.5  5.   7.5 10. ]

3.6数组排序sort与拼接合并concatenate

python 复制代码
import numpy as np

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

# 默认从小到大排序,并且不改变原数组
arr = np.sort(a)
print(arr) # [1 2 3 4 5 6 7 8]
print(a) # [2 1 5 3 7 4 6 8]

# 一维数组合并
b = np.array([1, 2, 3, 4])
c = np.array([5, 6, 7, 8])
brr = np.concatenate((b, c))
print(brr) # [1 2 3 4 5 6 7 8]

# 二维数组合并  axis=0代表垂直方向,axis=1代表水平方向,
b = np.array([[1, 2], [3, 4]])
c = np.array([[5, 6], [7, 8]])
brr = np.concatenate((b, c), axis=0)
print(brr)
#  [[1 2]
#  [3 4]
#  [5 6]
#  [7 8]]
crr = np.concatenate((b, c), axis=1)
print(crr) 
# [[1 2 5 6]
#  [3 4 7 8]]

3.7高维数组的ndim、size和shape

python 复制代码
import numpy as np

# 三维数组
a = np.array([[[0, 1, 2, 3],
               [4, 5, 6, 7]],

              [[0, 1, 2, 3],
               [4, 5, 6, 7]],

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

print(a.ndim) # 3   三维
print(a.size) # 24  有24个元素 
print(a.shape) # (3, 2, 4)   3层、2行、4列

3.8reshape

python 复制代码
import numpy as np

# reshape不改变原数组,但要保证reshape前后size一样
a = np.arange(6)
print(a) # [0 1 2 3 4 5]
b = a.reshape(2, 3)
print(b)
# [[0 1 2]
#  [3 4 5]]
print(a) # [0 1 2 3 4 5]

3.9一维数组转换为二维数组

python 复制代码
import numpy as np

# 可以这么理:前者是先扩维再把原数组加进新维度,后者是先把数组列出来然后对每一个元素进行扩维
a = np.array([1, 2, 3])
print(a) # [1 2 3]

a2 = a[np.newaxis, :]
print(a2) # [[1 2 3]]  (1, 3)这种形式称为行向量

a3 = a[:, np.newaxis]
print(a3) # (3, 1)这种形式称为列向量
# [[1]
#  [2]
#  [3]]

上面的方法要是不好理解,也可以用 reshape 进行维度转换,更好理解一点。

python 复制代码
import numpy as np

a = np.array([1, 2, 3])
print(a) # [1 2 3]

a2 = np.expand_dims(a, axis= 1)
print(a2) #   (3, 1)这种形式称为列向量
# [[1]
#  [2]
#  [3]]

a3 = np.expand_dims(a, axis= 0)
print(a3) # [[1 2 3]] (1, 3)这种形式称为行向量

3.10数组的有条件查找

python 复制代码
import numpy as np

a = np.array([1, 2, 3])
print(a[1]) # 2
print(a[0:2]) # [1 2]
print(a[1:]) # [2 3]
print(a[-2:]) # [2 3]

# 以下操作不改变b
b = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(b < 5)
# [[ True  True  True  True]
#  [False False False False]
#  [False False False False]]
print(b[b < 5]) # [1 2 3 4]
print(b[b >= 5]) # [ 5  6  7  8  9 10 11 12]
print(b[(b > 5) | (b == 5)]) # [ 5  6  7  8  9 10 11 12]

print(b[b % 2 == 0]) # [ 2  4  6  8 10 12]

print(b[(b > 2) & (b < 11)]) # [ 3  4  5  6  7  8  9 10]

c = np.nonzero(b < 6)  # 查找数组中小于6的元素的位置
# 输出两个数组,第一个数组代表小于6的元素的行,第二个数组代表小于6的元素的列
print(c) # (array([0, 0, 0, 0, 1]), array([0, 1, 2, 3, 0]))
print(b[c]) # [1 2 3 4 5]

3.11数组的拼接、切割、view概念

3.11.1拼接
python 复制代码
import numpy as np

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

b = np.array([[1, 1], [2, 2]])
c = np.array([[3, 3], [4, 4]])
b1 = np.vstack((b, c)) # 垂直方向拼接
print(b1)
# [[1 1]
#  [2 2]
#  [3 3]
#  [4 4]]
b2 = np.hstack((b, c)) # 水平方向拼接
print(b2)
# [[1 1 3 3]
#  [2 2 4 4]]
3.11.2切割
python 复制代码
import numpy as np

a = np.arange(1, 25).reshape(2, 12)
print(a)
# [[ 1  2  3  4  5  6  7  8  9 10 11 12]
#  [13 14 15 16 17 18 19 20 21 22 23 24]]

# 水平方向,平均分成3份
a1 = np.hsplit(a, 3)
print(a1)
# [array([[ 1,  2,  3,  4],
#        [13, 14, 15, 16]]),
#  array([[ 5,  6,  7,  8],
#        [17, 18, 19, 20]]),
#  array([[ 9, 10, 11, 12],
#        [21, 22, 23, 24]])]

# 水平方向,第3列切一下,第5列切一下
a2 = np.hsplit(a, (3, 5))
print(a2)
# [array([[ 1,  2,  3],
#        [13, 14, 15]]), 
#  array([[ 4,  5],
#        [16, 17]]), 
#  array([[ 6,  7,  8,  9, 10, 11, 12],
#        [18, 19, 20, 21, 22, 23, 24]])]
3.11.3view概念
python 复制代码
import numpy as np

a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

# 这种方式可以认为a1是a的一个view
a1 = a[0, :]
print(a1) # [1 2 3 4]
a1[0] = 99
print(a)
# [[99  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]

# 这种方式a2不会影响到a
a2 = a.copy()
a2[0,0] = 0
print(a2)
# [[ 0  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]
print(a)
# [[99  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]

3.12array的基本数学运算

数组之间

python 复制代码
import numpy as np

a = np.array([1, 2])
b = np.array([1, 1])
# 对应位置相加
print(a + b) # [2 3]
# 对应位置相减
print(a - b) # [0 1]
# 对应位置相乘
print(a * b) # [1 2]
# 对应位置取余
print(a % b) # [0 0]
# 对应位置取商
print(a // b) # [1 2]


c = np.array([1, 2, 3, 4])
# 数组元素求和
print(c.sum()) # 10
# 数组元素求均值
print(c.mean()) # 2.5
# 数组元素求标准差
print(c.std()) # 1.118033988749895
# 数组元素求最大值
print(c.max()) # 4
# 数组元素求最小值
print(c.min()) # 1


d = np.array([[1, 1], [2, 2]])
# 在列方向上求和
print(d.sum(axis=0)) # [3 3]
# 在行方向上求和
print(d.sum(axis=1)) # [2 4]

数组和数的运算

python 复制代码
import numpy as np

a = np.array([1.0, 2.0])
# 数组每个数都会乘常数
print(a * 1.6) # [1.6 3.2]


b = np.array([[1, 2], [3, 4], [5, 6]])
# 记住:逗号前管行,逗号后管列
print(b[0, 1]) # 2
print(b[1:3])
# [[3 4]
#  [5 6]]
print(b[0:2, 0]) # [1 3]

二维数组的运算

python 复制代码
import numpy as np

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

# 对应位置相加
print(a + b)
# [[2 3]
#  [4 5]]

c = np.array([[1, 2]])
# 如果数组大小不匹配,它会扩展成格式一样的
print(a + c)
# [[2 4]
#  [4 6]]

3.13np.ones()的特殊用法

python 复制代码
import numpy as np
a = np.ones(5)
print(a) # [1. 1. 1. 1. 1.]

b = np.ones((3, 2))
print(b) # 3行2列
# [[1. 1.]
#  [1. 1.]
#  [1. 1.]]

c = np.ones((2,3,2))
print(c) # 2层3行2列
# [[[1. 1.]
#   [1. 1.]
#   [1. 1.]]
#
#  [[1. 1.]
#   [1. 1.]
#   [1. 1.]]]

3.14生成随机数组

python 复制代码
import numpy as np

a = np.random.default_rng()

# 生成3个0-1之间的随机数
a1 = a.random(3)
print(a1) # [0.50516315 0.36888279 0.6791795 ]
# 生成3行2列个0-1之间的随机数
a2 = a.random((3, 2))
print(a2)
# [[0.43429826 0.62157587]
#  [0.56252055 0.21967775]
#  [0.56787275 0.73349204]]


# 生成3个0-4之间的随机整数
a3 = a.integers(5, size=(3,))
print(a3) # [3 1 2]
# 生成3行2列个0-4之间的随机整数
a4 = a.integers(5, size=(3, 2))
print(a4)
# [[0 4]
#  [3 3]
#  [3 2]]

3.15unique函数

python 复制代码
import numpy as np

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

# 返回:过滤掉数组中重复的元素、元素第一次出现的下标、元素出现的次数
a1, first_index, counts = np.unique(a, return_index=True, return_counts=True)
print(a1) # [2 3 4 5 6 7 8]
print(first_index) # [ 0  3  4  5  6 10 11]
print(counts) # [4 2 2 1 1 1 1]

b = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [1, 2, 3, 4]])
b1 = np.unique(b)
print(b1) # [ 1  2  3  4  5  6  7  8  9 10 11 12]
b2 = np.unique(b, axis=0) # 列的方向过滤
print(b2)
# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]]
b3 = np.unique(b, axis=1) # 行的方向过滤
print(b3)
# [[ 1  2  3  4]
#  [ 5  6  7  8]
#  [ 9 10 11 12]
#  [ 1  2  3  4]]

3.16转置

python 复制代码
import numpy as np

a = np.arange(1, 7).reshape(2, 3)
print(a)
# [[1 2 3]
#  [4 5 6]]

# 转置1
a1 = a.transpose()
print(a1)
# [[1 4]
#  [2 5]
#  [3 6]]

# 转置2
a2 = a.T
print(a2)
# [[1 4]
#  [2 5]
#  [3 6]]

3.17翻转

python 复制代码
import numpy as np

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

a1 = np.flip(a)
print(a1) # [8 7 6 5 4 3 2 1]

b = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
b1 = np.flip(b) # 对行和列同时翻转
print(b1)
# [[12 11 10  9]
#  [ 8  7  6  5]
#  [ 4  3  2  1]]

b2 = np.flip(b, axis=0) # 列方向上翻转
print(b2)
# [[ 9 10 11 12]
#  [ 5  6  7  8]
#  [ 1  2  3  4]]

b3 = np.flip(b, axis=1) # 行方向上翻转
print(b3)
# [[ 4  3  2  1]
#  [ 8  7  6  5]
#  [12 11 10  9]]

b[1] = np.flip(b[1])  # 对特定行翻转
print(b)
# [[ 1  2  3  4]
#  [ 8  7  6  5]
#  [ 9 10 11 12]]

b[:, 1] = np.flip(b[:, 1])  # 对特定列翻转
print(b)
# [[ 1 10  3  4]
#  [ 8  7  6  5]
#  [ 9  2 11 12]]

3.18降维

python 复制代码
import numpy as np

a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

# 降维,对b操作【不改变】原数组
b = a.flatten()
print(b) # [ 1  2  3  4  5  6  7  8  9 10 11 12]

# 降维,对c操作【会】改变原数组
c = a.ravel()
print(c) # [ 1  2  3  4  5  6  7  8  9 10 11 12]

3.19数组的保存和加载

python 复制代码
import numpy as np

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

np.save(r'./data', a) # 默认保存成npy格式
b = np.load(r'./data.npy')
print(b) # [1 2 3 4 5 6]

np.savetxt(r'./data.txt', a)
c = np.loadtxt('./data.txt')
print(c) # [1. 2. 3. 4. 5. 6.]
相关推荐
IPdodo_18 分钟前
静态 IP 访问异常排查:403/429 归因与迁移验收
服务器·网络·数据库·python·网络协议·php·性能测试
Zengs27 分钟前
Python 脚本日志怎么分级落盘?排错时一次找准现场
python
OPEN-F40 分钟前
C++综合实战:面向对象图书管理系统
开发语言·c++
ttwuai1 小时前
Go 后台清空操作日志失败,权限和无 WHERE 删除怎么排查?
开发语言·后端·golang
baopixiaoz1 小时前
BeeQuant × BeeAgent:AI量化新范式
大数据·人工智能·python·区块链
西西弗Sisyphus1 小时前
Qt 在无边框窗口上做一套换肤系统
开发语言·数据库·qt
西西弗Sisyphus1 小时前
Qt 启动 UsageStatistic 插件报错
开发语言·qt
NeoGressAI外贸数字化1 小时前
外贸独立站零询盘排查:从 Google Search Console 到 PageSpeed 的技术实操
开发语言·c++
IT毕设实战小研1 小时前
基于大数据的AI应用对就业与收入增长的区域差异分析及可视化
大数据·人工智能·python·随机森林·机器学习·课程设计