本章内容:
- 为什么选择Numpy
- ndarray对象
- 数据类型与数组计算
- 数组中的轴
- 数组索引与切片
- 数组的修改、添加
一、为什么选择numpy
numpy支持常见的数组与矩阵操作。对于同样的数值计算任务,使用numpy比直接使用python要简洁,其使用ndarray对象作为数据容器来处理多维数组,该对象是兼具快速而灵活的数据容器。由于numpy中使用C的API实现,依靠连续内存操作,比python内置类型list要有更优异的性能。
二、ndarray对象
只能存放同一类型的数据,可设计为多维数组。
可以通过多种方式创建:
示例:
import numpy as np
list1 = [1,2,3,4]
oneArray = np.array(list1)
print(type(oneArray))
print(oneArray)
'''
<class 'numpy.ndarray'>
[1 2 3 4]
'''
oneArray = np.eye(3,3)
print(oneArray)
'''
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
'''
常用属性:
print(oneArray.ndim)
print(oneArray.shape)
print(oneArray.size)
'''
2
(3, 3)
9
'''
调整形状:
arr = np.array([[1,2,3],[4,5,6]])
arr.shape = (3,2)
arr = arr.reshape(3,2)
'''
array([[1, 2],
[3, 4],
[5, 6]])
'''
arr = arr.reshape((6,),order = 'F')
arr
'''
F按列展开(C按行展开):
array([1, 3, 5, 2, 4, 6])
'''
与python list转换
a= np.array([9, 12, 88, 14, 25])
list_a = a.tolist()
print(list_a)
print(type(list_a))
'''
[9, 12, 88, 14, 25]
<class 'list'>
'''
三、数据类型与数组计算
获取字节单位长度itemsize:
f = np.array([1,2,3,4,5], dtype = np.int16)
# 返回数组中每个元素的字节单位长度
print(f.itemsize)
# 获取数据类型
print(f.dtype)
'''
2
int16
'''
调整数据类型astype:
f = f.astype(np.float64)
print(f.dtype)
'''
float64
'''
生成随机小数并保留小数点后两位:
print(np.round(np.random.random(),2))
arr = np.array([np.random.random() for i in range(10)])
print(np.round(arr,2))
'''
0.37
[0.27 0.78 0.78 0.78 0.44 0.89 0.47 0.87 0.72 0.41]
'''
计算过程中由于广播机制,加减乘除操作会在所有元素上进行:
t1 = np.arange(24).reshape((6,4))
print(t1,end='\n\n')
print(t1+2,end='\n\n')
print(t1*2,end='\n\n')
print(t1/2,end='\n\n')
'''
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]
[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]
[14 15 16 17]
[18 19 20 21]
[22 23 24 25]]
[[ 0 2 4 6]
[ 8 10 12 14]
[16 18 20 22]
[24 26 28 30]
[32 34 36 38]
[40 42 44 46]]
[[ 0. 0.5 1. 1.5]
[ 2. 2.5 3. 3.5]
[ 4. 4.5 5. 5.5]
[ 6. 6.5 7. 7.5]
[ 8. 8.5 9. 9.5]
[10. 10.5 11. 11.5]]
'''
注意:不同形状的两个多维数组不能计算!
行数或列数相同的一维数组与多维数组可以计算:
# 行形状相同:广播
t1 = np.arange(24).reshape((4,6))
t2 = np.arange(0,6)
print(t1)
print(t2)
print(t1-t2)
'''
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[0 1 2 3 4 5]
[[ 0 0 0 0 0 0]
[ 6 6 6 6 6 6]
[12 12 12 12 12 12]
[18 18 18 18 18 18]]
'''
四、数组中的轴
什么是轴?
二维:
三维:
沿轴向计算:
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
# 二维
print(np.sum(a,axis = 0))
print(np.sum(a,axis = 1))
print(np.sum(a))
# 三维
a = np.arange(27).reshape(3,3,3)
print(a)
b = np.sum(a,axis=0)
print(b)
'''
[5 7 9]
[ 6 15]
21
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]]
[[ 9 10 11]
[12 13 14]
[15 16 17]]
[[18 19 20]
[21 22 23]
[24 25 26]]]
[[27 30 33]
[36 39 42]
[45 48 51]]
'''
五、数组的索引与切片
多维数组中的切片方法:
数据:
t1 = np.arange(24).reshape(4,6)
print(t1)
'''
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
'''
1、取一行
# (一行代表是一条数据,索引也是从0开始的)
print(t1[1])
print(t1[1,:])
'''
[ 6 7 8 9 10 11]
'''
2、取连续行列
形式:数组[行(可以使用切片),列(可以使用切片)]
# 取连续的多行
print(t1[1:])
print(t1[1:3,:])
'''
[[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[[ 6 7 8 9 10 11]
[12 13 14 15 16 17]]
'''
3、取非连续行列
形式:数组[行(可以使用切片),列(可以使用切片)]
print(t1[[0,2,3]])# 取不连续的多行
print(t1[[0,2,3],:])# 取不连续的多行
print(t1[:,1])# 取一列
print(t1[:,1:])# 连续的多列
print(t1[:,[0,2,3]])# 取不连续的多列
'''
[[ 0 1 2 3 4 5]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[[ 0 1 2 3 4 5]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[ 1 7 13 19]
[[ 1 2 3 4 5]
[ 7 8 9 10 11]
[13 14 15 16 17]
[19 20 21 22 23]]
[[ 0 2 3]
[ 6 8 9]
[12 14 15]
[18 20 21]]
'''
4、取值
形式:数组[行(可以使用切片),列(可以使用切片)]
print(t1[2,3])
print(t1[[0,1,1],[0,1,3]])
'''
15
[0 7 9]
'''
六、数组的修改、添加、删除与去重
1、修改
在上一节的索引与切片操作后直接赋值,如果是多行多列会广播进行修改,如果是不相邻的点则直接修改值。
布尔mask:
可以用已有的ndarray布尔矩阵作为条件来过滤目标矩阵中的元素。
形成布尔mask的方法:
t = np.arange(24).reshape(4,6)
print(t)
# 可以根据条件修改,比如讲小于10的值改掉
t[t<10]=0
t[t<10]
# 使用逻辑判断
np.logical_and &
np.logical_or |
np.logical_not ~
t[(t>2)&(t<6)]=0 # 与
t[(t<2)|(t>6)]=0 # 或
t[~(t>6)]=0 # 非
print(t)
或采用三目运算符:
# 三目运算( np.where(condition, x, y)满足条件(condition),输出x,不满足输出y。))
score = np.array([[80,88],[82,81],[75,81]])
result = np.where(score>80,True,False)
print(result)
'''
[[False True]
[ True True]
[False True]]
'''
2、添加
(1)使用append函数
沿轴0方向进行添加:
a = np.array([[1,2,3],[4,5,6]])
print (np.append(a, [[7,8,9]],axis = 0))
'''
[[1 2 3]
[4 5 6]
[7 8 9]]
'''
沿轴1方向进行添加:
a = np.array([[1,2,3],[4,5,6]])
print (np.append(a, [[5,5,5],[7,8,9]],axis = 1))
'''
[[1 2 3 5 5 5]
[4 5 6 7 8 9]]
'''
不说明轴,直接展开添加:
print (np.append(a, [7,8,9]))
'''
[1 2 3 4 5 6 7 8 9]
'''
(2)使用insert函数(需要提供一个索引值)
不给axis参数就直接insert
a = np.array([[1,2],[3,4],[5,6]])
print(np.insert(a,3,[11,12]))
'''
[ 1 2 3 11 12 4 5 6]
'''
沿轴0广播:
a = np.array([[1,2],[3,4],[5,6]])
print(np.insert(a,3,[11]),axis = 0)
'''
[[ 1 2]
[ 3 4]
[ 5 6]
[11 11]]
'''