文章目录
-
- 1.为什么有数组list了还要用numpy?
- 2.array规则
- 3.常用操作
-
- 3.1创建数组
- 3.2一维数组索引+赋值+切片
- 3.3二维数组取值
- 3.4数组的一些属性方法ndim+shape+size+dtype
- 3.5创建数组常用函数zeros+ones+empty+arange+linspace
- 3.6数组排序sort与拼接合并concatenate
- 3.7高维数组的ndim、size和shape
- 3.8reshape
- 3.9一维数组转换为二维数组
- 3.10数组的有条件查找
- 3.11数组的拼接、切割、view概念
- 3.12array的基本数学运算
- 3.13np.ones()的特殊用法
- 3.14生成随机数组
- 3.15unique函数
- 3.16转置
- 3.17翻转
- 3.18降维
- 3.19数组的保存和加载
1.为什么有数组list了还要用numpy?
数组list处理 小量数据 时性能尚可,大量数据 还得用numpy
list处理大量数据时占的空间大,速度慢
2.array规则
array即数组,有一维数组,二维数组,三维数组...
array在numpy中称为:ndarray,全称N-dimensional array
有三个规则:
- 数组中所有元素必须是相同类型。不像python中的数组list,里面的元素可以是不同类型
- 数组大小不能改变。比如创建了一个3 * 4的二维数组,它大小是12,你可以把它变成4 *3、1 * 12、12 * 1,但就是不能改变其大小
- 数组形状必须是矩形。比如创建一个对称矩阵,每个元素你都必须写出来,不能只写一半元素
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.]