文章目录
-
- 科学计算工具numpy(下)
-
- 四、numpy的索引和切片
-
-
- 1.narray的基本索引与切片
- 2.narray的布尔型索引与切片
-
- 五、numpy的索引和切片
- 六、numpy的随机数生成
-
-
- 1.normal()
- 2.rand()
- 3.randn()
- 4.randint()
-
- 七、numpy的数据存储
-
-
- 1.npy文件
- 2.txt文件
-
科学计算工具numpy(下)
四、numpy的索引和切片
1.narray的基本索引与切片
ndarray的基本索引与列表的索引与切片非常的类似:
# 着重讨论二维
ar = np.arange(20).reshape(4, 5)
print(ar)
print(ar[1:3][:])
print(ar[::2])
print("----")
# 另一种用逗号分割索引的方法, ar[a:b][c:d]与ar[a:b, c:d]等价
print(ar[2, 2]) # 逗号之前是行,逗号之后是列
print(ar[1:3, :])
#结果:
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
[[ 5 6 7 8 9]
[10 11 12 13 14]]
[[ 0 1 2 3 4]
[10 11 12 13 14]]
----
12
[[ 5 6 7 8 9]
[10 11 12 13 14]]
注意:narray的索引和列表类似也支持负值索引
eg:
ar = np.arange(10).reshape(2, 5)
print(ar)
print(ar[-1][-1])
# 结果:
[[0 1 2 3 4]
[5 6 7 8 9]]
9
2.narray的布尔型索引与切片
# 一维布尔型
ar = np.arange(20).reshape(4, 5)
print(ar)
i = [True, False, True, False]
j = [True, True, False, False, False] # 注意:这个i的元素个数与行数相同, j的元素个数与列数相同
print(ar[i, j]) # 打印行列都为True的元素组成的narray
print(ar[i]) # 等价于 print(ar[i,]) 等价于 print(ar[i, :]) -----打印为True的行
print(ar[:, j]) # 打印为True的列
print('-------')
# 二维布尔型
k = ar > 5
print(k)
print(ar[k]) # 等价于 ar[ar>5] 打印行列都为True的元素组成的narray
# 结果:
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
[ 0 11]
[[ 0 1 2 3 4]
[10 11 12 13 14]]
[[ 0 1]
[ 5 6]
[10 11]
[15 16]]
-------
[[False False False False False]
[False True True True True]
[ True True True True True]
[ True True True True True]]
[ 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
小结:ar[][]里面只能是数值,列表类似的形式。
ar[a, b] 其中的a,b可以是数值,列表类似的形式, 也可以是布尔类型的一维列表,也可以是a[k] k是二维的布尔型array
五、numpy的索引和切片
# 一次修改一个元素
ar = np.arange(10).reshape(2, 5)
ar[1][2] = 100
print(ar)
# 一次修改多个相邻的元素
ar[:, 2:] = 0 # 不能是 ar[:][2:] = 0 这样是错误的
print(ar)
# 结果:
[[ 0 1 2 3 4]
[ 5 6 100 8 9]]
[[0 1 0 0 0]
[5 6 0 0 0]]
小结:1.如果是索引某二维array的元素,或者显示其中多行多列时用ar[][],其他情况尽量用ar[, ]
2.列表不能用ar[a;b] = 100的形式来修改多个元素的值, 而一维的array可以
六、numpy的随机数生成
1.normal()
# 生成一个标准正太分布的4*4样本值
ar = np.random.normal(size=(4, 4)) # 必须是这样,size和()都不能省 ---size是设置其形状,一维的是size=4,二维的是元组size=(4, 4)
print(ar)
# 结果:
[[ 0.92682019 0.614566 -1.80085596 -0.57091276]
[-1.1043685 1.18126955 0.06992522 0.65164341]
[-1.17288536 0.16927536 0.25020451 0.71442432]
[-0.80502592 0.60329458 0.47879308 -0.76152008]]
2.rand()
# 一维随机数数组
ar = np.random.rand(4) # 随机生成4个[0, 1)的浮点数
print(ar)
# 二维随机数数组
ar = np.random.rand(2, 3) # 2行3列的随机数组,元素值[0, 1)的浮点数,等价于 np.random.rand(6).reshape(2, 3)
print(ar)
# 结果:
[0.07855698 0.45287721 0.29377833 0.4874729 ]
[[0.85758177 0.93625845 0.3834727 ]
[0.17223084 0.60032557 0.81499668]]
3.randn()
# numpy.random.randn(d0, d1, ..., dn):生成一个浮点数或N维浮点数组 —— 正态分布
ar = np.random.randn(2, 3) # 二维的正态分布
print(ar)
# 结果:
[[ 0.79419815 -0.87986761 -0.37048526]
[ 1.00269964 -1.59903582 -1.65729325]]
4.randint()
# numpy.random.randint(low, high=None, size=None, dtype='l'):生成一个整数或N维整数数组
# 若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数,且high必须大于low
# dtype参数:只能是int类型
ar1 = np.random.randint(3, size=4)
print(ar1)
ar2 = np.random.randint(2, 10, size=(2, 3))
print(ar2)
# 结果:
[1 1 0 1]
[[2 9 4]
[3 2 7]]
小结:
1.正太分布有np.random.normal()和np.random.randn()两种
2.对于参数size,如果是一维的,直接size=a 二维的用元组size=(a,b) 多维的类似
3.随机数的取值一般都是左闭右开 [a, b)
4.rand和randn参数没有size,直接用 np.random.rand(a, b)
七、numpy的数据存储
1.npy文件
# 1---.npy文件
import os
os.chdir('D:/') # 文件夹路径
ar = np.random.rand(4, 4)
print(ar)
np.save('test.npy', ar) # 若文件不存在,会自动建立,默认是覆盖写入 wb
a = np.load('test.npy')
print(a)
# 结果:
[[0.92373925 0.32301451 0.51564998 0.80733927]
[0.89979651 0.8530066 0.0987105 0.80803988]
[0.79187015 0.02192928 0.89630674 0.05568327]
[0.3872979 0.74023464 0.60665628 0.29358984]]
[[0.92373925 0.32301451 0.51564998 0.80733927]
[0.89979651 0.8530066 0.0987105 0.80803988]
[0.79187015 0.02192928 0.89630674 0.05568327]
[0.3872979 0.74023464 0.60665628 0.29358984]]
2.txt文件
import os
# 2---.txt文件
ar = np.random.rand(2, 3)
np.savetxt('text.txt', ar, delimiter=',')
print(ar)
a = np.loadtxt('text.txt', delimiter=',')
print(a)
# 结果:
[[0.70941669 0.44031327 0.34353032]
[0.5805601 0.52475665 0.0504758 ]]
[[0.70941669 0.44031327 0.34353032]
[0.5805601 0.52475665 0.0504758 ]]