数据分析---科学计算工具numpy(下)

科学计算工具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 ]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElegantCodingWH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值