展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

NumPy基础使用(二)

  • 复合类型
"""
第一层必须是元组
默认情况下,需要每个元素的数据类型保持一致 
如果每个元素的元素类型不一致,需要分别指定每个元素的类型   
指定元素类的方式:
方式一:
    np.array(data,dtype="3str,int,3int")  
方式二:简写
    np.array(data,dtype="U3,i,3i")
    字符码          简写
    bool            ?
    int8/16/32/64   i1/2/4/8
    float8/16/32/64 f1/2/4/8
    str             U<字符数>
    datetime64      M8[Y] M8[M] M8[D] M8[h] M8[m] M8[s]
方式三:别名
    dtype=[
        ('name','U3'), 
        ('sno','i'),
        ('score','i',3)    # 成绩的别名score,类型是int,长度是3
        ]    
"""

data = [
    ("张三s",1,[89,90,70]),
    ("李四",2,[99,89,77]),
    ("王五是",3,[77,99,88])
]
# 参数,指定类型
a = np.array(data,dtype="U3,i,3i")
print(a)

# output
[('张三s', 1, [89, 90, 70]) ('李四', 2, [99, 89, 77]) ('王五是', 3, [77, 99, 88])]

# 遍历
for stu in a:
    for s in stu:
        print(s)

# output
张三s
1
[89 90 70]
李四
2
[99 89 77]
王五是
3
[77 99 88]

for stu in a:
    print("学号:",stu[1])
    print("姓名:",stu[0])
    print("成绩:")
    print("语文",stu[2][0],"数学:",stu[2][1],"英语",stu[2][2])

#  output
学号: 1
姓名: 张三s
成绩:
语文 89 数学: 90 英语 70
学号: 2
姓名: 李四
成绩:
语文 99 数学: 89 英语 77
学号: 3
姓名: 王五是
成绩:
语文 77 数学: 99 英语 88
  • 别名方式
data = [
    ("张三s",1,[89,90,70]),
    ("李四",2,[99,89,77]),
    ("王五是",3,[77,99,88])
]
dtype=[
    ('name','U3'),
    ('sno','i'),
    ('score','i',3)
]
a = np.array(data,dtype=dtype)
print(a)
b = a[0][0] # 通过下标取
print(b)
c = a[0]['name']  # 通过列名取值
print(c)

# output
[('张三s', 1, [89, 90, 70]) ('李四', 2, [99, 89, 77]) ('王五是', 3, [77, 99, 88])]
张三s
张三s
  • 日期
data = [
    "2023",
    "2023-11",
    "2023-11-09",
    "2023-11-09 11:16:15"
]
a = np.array(data)
# 进行类型转换
b = a.astype("M8[h]")
print(b)
print(b.dtype)
# 计算
c = b[0]-b[1]
print(c)

# output
['2023-01-01T00' '2023-11-01T00' '2023-11-09T00' '2023-11-09T11']
datetime64[h]
-7296 hours
  • 切片
a = np.arange(20,38)
print(a)
print(a[2:5]) # 取出下标2-4的元素
print(a[:5]) # 取出下标0-4的元素
print(a[2:])  # 取出下标2-最后 的元素)
print(a[2:10:2]) # 取值后 下标+2
print(a[::-1])  # 倒叙数组

a.shape = (3,6)
print(a)
print(a[1:3])
print(a[0,0]) # 获取下标0,0的元素
print(a[0][0]) # 获取下标0,0的元素
print(a[0,0:3]) # 0行 0-2的元素
print(a[:2,:3])  # 0-1行中的 0-2列的元素
print(a[:2,2:5])
print(a[:,2:5])
output
[20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37]
[22 23 24]
[20 21 22 23 24]
[22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37]
[22 24 26 28]
[37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20]

[[20 21 22 23 24 25]
 [26 27 28 29 30 31]
 [32 33 34 35 36 37]]
[[26 27 28 29 30 31]
 [32 33 34 35 36 37]]
20
20
[20 21 22]
[[20 21 22]
 [26 27 28]]
[[22 23 24]
 [28 29 30]]
[[22 23 24]
 [28 29 30]
 [34 35 36]]
  • 案例
a = np.arange(1,11)
print(a)
a[0] = 10
print(a)
a[3:7] = 20
print(a)
a[:] = 0    # 全部设置为0
print(a)
# 掩码筛选出偶数
a[a%2==0] = -1
print(a)
output
[ 1  2  3  4  5  6  7  8  9 10]
[10  2  3  4  5  6  7  8  9 10]
[10  2  3 20 20 20 20  8  9 10]
[0 0 0 0 0 0 0 0 0 0]
[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1]
  • 掩码
a = np.arange(1,5)
print(a)
m = [True,False,True,False] # 掩码
b = a[m] # 通过掩码获取值
print(b)

a = np.arange(1,11)
print(a)
b = a > 4
print(a[b])

# 输出打印
[1 2 3 4]
[1 3]

[ 1  2  3  4  5  6  7  8  9 10]
[ 5  6  7  8  9 10]
  • 案例
a = np.arange(1,101)
# 循环
lst = []
for i in a:
    if(i%3==0):
       lst.append(i)
print(lst)
# 推导式
lst = [i for i in a if i%3==0]
print(lst)
# 掩码
lst = a[a%3==0]
print(lst)

a = np.arange(1,101)
b = (a%3==0) & (a%7==0)
print(a[b])
output
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
[ 3  6  9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99]
[21 42 63 84]
  • 垂直合并与垂直拆分
a = np.arange(1,13).reshape(4,3)
b = np.arange(13,19).reshape(2,3)
print(a)
print(b)
# 垂直合并两个数组,参数要是一个元组
c = np.vstack((a,b))  
print(c)
# 将数组垂直拆分,要能被等分
d = np.vsplit(c,3)  # 将c拆分成3份
for d1 in d:
    print(d1)

# 输出打印
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]

[[13 14 15]
 [16 17 18]]

[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]
 [13 14 15]
 [16 17 18]]

[[1 2 3]
 [4 5 6]]
[[ 7  8  9]
 [10 11 12]]
[[13 14 15]
 [16 17 18]]
  • 案例
bj1 = [
    ["张三",89,90,78],
    ["李四",89,90,78],
    ["王五",89,90,78],
    ["赵六",89,90,78]
]
bj2 = [
    ["张三1",89,90,78],
    ["李四1",89,90,78]
]
a1  = np.array(bj1)
a2 = np.array(bj2)
c = np.vstack((a1,a2))
print(c)
print(len(c),c.size)
output
[['张三' '89' '90' '78']
 ['李四' '89' '90' '78']
 ['王五' '89' '90' '78']
 ['赵六' '89' '90' '78']
 ['张三1' '89' '90' '78']
 ['李四1' '89' '90' '78']]
6 24
  • 水平合并与水平拆分
a1 = np.arange(1,10).reshape(3,3)
a2 = np.arange(11,20).reshape(3,3)
print(a1)
print(a2)
# axis=0表示垂直合并,axis=1表示水平合并
c = np.concatenate((a1,a2),axis=1)
print(c)
# axis拆分的方向:0表示x轴,1表示y轴
d = np.split(c,3,axis=1)
for d1 in d:
    print(d1)
output
[[1 2 3]
 [4 5 6]
 [7 8 9]]
[[11 12 13]
 [14 15 16]
 [17 18 19]]

[[ 1  2  3 11 12 13]
 [ 4  5  6 14 15 16]
 [ 7  8  9 17 18 19]]

[[1 2]
 [4 5]
 [7 8]]
[[ 3 11]
 [ 6 14]
 [ 9 17]]
[[12 13]
 [15 16]
 [18 19]]
  • 常用方法
a = np.arange(1,11)
print(a)    # [ 1  2  3  4  5  6  7  8  9 10]
b = np.sum(a)  # 求和,55
print(b)
b = np.mean(a) # 求平均,5.5
print(b)
b = np.prod(a) # 求所有元素的乘积,3628800
print(b)
b = np.max(a) # 求最大值,10
print(b)
b = np.argmax(a) # 求最大值的下标,9
print(b)
b = np.min(a) # 求最小值,1
print(b)
b = np.argmin(a) # 求最小值的下标,0
print(b)
b = np.std(a) # 求标准差,2.8722813232690143
print(b)
b = np.var(a) # 求方差,8.25
print(b)
b = np.cumsum(a) # 从0开始累积和,[ 1  3  6 10 15 21 28 36 45 55]
print(b)
b = np.cumprod(a) # 从1开始累积乘积,[      1       2       6      24     120     720    5040   40320  362880 3628800]
print(b)
b = np.median(a) # 求中位数,5.5
print(b)
posted @ 2023-11-10 20:50  DogLeftover  阅读(6)  评论(0编辑  收藏  举报