数据分析03 numpy数据类型和索引切片


numpy数据类型

布尔类型(bool)

import  numpy as np
arr = np.array([1,0,1,0],dtype="bool")
arr = np.array([1,0,1,0,2],dtype=np.bool)
print(arr)

# 上面2种写法都是对的,都是转换为bool类型的
# 输出为
[ True False  True False  True]

非0的就是true,0就是false

整数类型(int,unit)

arr = np.array([1,2,3],dtype=np.int8)
# 2的8次方的范围,不能表达128
print(arr)

# 因此的话我们一般写int就行了,他会自动的帮我设置最优范围的

浮点数(float)

复数(complex)

索引和切片

帮我查数据,怎么数据

切片

基本取值

# 一维数组的索引和切片
arr = np.random.randint(1,20,10)
print(arr)

# [13 17  9  6 14 15 19 13  8 17]

# 基础索引,获取单个数据
print(arr[0])
# 13


# 二维数组
arr = np.random.randint(1,30,size=(2,5))
print(arr)

# 行和列 都有索引,前面表示行的索引,后面表示列的索引
print(arr[1,2])

: 行和列取值

# 获取全部的数据,一维数组只有一行 : 处理行和列的
print(arr[:])

# [13 17  9  6 14 15 19 13  8 17]

# 生成一个2行5列形状的二维数组
arr = np.random.randint(1,30,size=(2,5))
# 取出所有的行和列
print(arr[:,:])
# 取出第二行的全部数据
print(arr[1:,:])
# 取出第二行,索引为2:4的数据
print(arr[1:,2:4])

# 前面表示行,后面表示列,列还可以指定范围进行取值,这个样的就比较的多了

# 输出为
[[12 27 28 24 11]

 [20 11  2 11 15]]
[[20 11  2 11 15]]

[[ 2 11]]

指定范围取值

这个跟slice(start,end,step) 一样的操作,但是显然了这个:还是好用

# 获取指定范围的数据
print(arr[1:3])  # [1:3)  右边不包含

# [17  9]

布尔取值

支持逻辑运算符的 | &

print(arr[arr>10])
print(arr[(arr>10) & (arr<16)])

# 输出为
[16 13 15 12 15 12]
[13 15 12 15 12]


arr = np.random.randint(1,30,size=(2,5))
print(arr[arr>10])

# 输出结果是一个一维的数据
# [16 13 21 20 11 21 17]

# 筛选出第一行中大于10的数据
print(arr[1][arr[1]>10])

# [11 28 28 18]

# 获取列的数据,获取第二列的数据
print(arr[:,2])

# [20  5]

numpy运算

一维数组运算

a = np.array([1,2,3])
b = np.array([4,5,6])
print(a+b)
print(a-b)
print(a*b)
print(a/b)

[5 7 9]
[-3 -3 -3]
[ 4 10 18]
[0.25 0.4  0.5 ]

# 这个是拼接的列表,原生的python不支持运算的,需要使用循环才能实现,比较的麻烦
l1 = [1,2,3]
l2 = [4,5,6]
print(l1+l2)

# [1, 2, 3, 4, 5, 6]

二维数组运算

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

# 依次相加
print(a+b)
[[ 2  4  6]
 [ 8 10 12]
 [14 16 18]]

print(a-b)

[[0 0 0]
 [0 0 0]
 [0 0 0]]

数组和标量(数字)进行运算

a = np.array([1,2,3])
# 里面的每个元素的数据都会增加3
print(a+3)

# [4 5 6]

广播机制

不规则的矩阵相加

广播的条件:

  • 第一种:行和列相同

  • 第二种:行为1和列为1

arr[1,2] 1行2列
arr[1,2,3] 1行3列

这个数据就不能广播,虽然行相同,但是列不相同,也没有1就不能实现广播

# 广播机制
# 同一维度:相同可以,或者是有一个为1就可以广播,行为1,但是列不为1或者不相同就不能广播

# 1行3列数组
a = np.array([1,2,3])
# 3行1列的数组
b = np.array([[1],[2],[3]])
print(a+b)

"""
a
1 2 3

b
1
2
3


广播后
a
1 2 3
1 2 3
1 2 3

b
1 1 1
2 2 2
3 3 3

变成相同的维度

"""

"""
就变成了什么了
第一行 2 3 4
第二行 3 4 5
第三方 4 5 6
"""

矩阵运算

还有矩阵,就是数组里面概念,二维数组

文章摘自:https://www.cnblogs.com/qylogs/p/20266150