1. Numpy的Ndarray对象
Ndarray:①N维数组对象 ②同一系列数据的集合 ③存放同类元素的多维数组
1.1.创建一维数组
法1.直接传入列表
import numpy as np
list1 = [1, 2, 3]
oneArray = np.array(list1)
print(type(oneArray)) # <class 'numpy.ndarray'>
print(oneArray) # [1 2 3]
法2.传入range生成序列
# 方法2 传入range生成序列
oneArray1 = np.array(range(1, 7))
print(type(oneArray1)) # <class 'numpy.ndarray'>
print(oneArray1) # [1 2 3 4 5 6]
法3.使用numpy自带的np.arange()生成数组
# 方法3 使用numpy自带的np.arange()生成数组
oneArray2 = np.arange(0, 8, 2)
print(type(oneArray2)) # <class 'numpy.ndarray'>
print(oneArray2) # [0 2 4 6]
1.2.创建二维数组
# 生成二维数组
list2 = [[1, 2], [3, 4], [5, 6]]
twoArray = np.array(list2)
print(twoArray)
1.3.常用的属性
# 1.获取维度
print(twoArray.ndim) # 2
# 2.形状(行,列)
print(twoArray.shape) # (3, 2)
# 3.元素个数
print(twoArray.size) # 6
1.4.调整数组的形状
# 调整数组的形状
"""
注意:转换前后数组中的元素个数要相等,否则会报错
"""
list3 = [[1, 2], [3, 4], [5, 6]]
a1 = np.array(list3)
print(a1)
print(a1.shape) # (3, 2)
# 1.修改原有的数组
a1.shape = (2, 3)
print(a1)
# 2.返回一个新的数组,不影响原来的数组
a2 = a1.reshape(2, 3)
print(a2)
# 3.将多维变成一维
a3 = a1.flatten(order='C')
a4 = a1.flatten(order='F')
print(a3) # [1 2 3 4 5 6]
print(a4) # [1 4 2 5 3 6]
# 将一维转换为多维
t1 = np.arange(24)
print(t1)
t2 = t1.reshape((4, 6))
print(t2)
# t3 = t1.reshape((2, 3, 4))
# print(t3)
1.5.将数组转为list
# 将数组转为list
arr1 = np.array([1, 2, 3, 4, 5, 6])
list_arr1 = arr1.tolist()
print(arr1) # [1 2 3 4 5 6]
print(list_arr1) # [1, 2, 3, 4, 5, 6]
2. 数组的计算
2.1. 数组和数的计算
# 1. 数组和数的计算
x1 = np.arange(0, 6)
print(x1)
print(x1 + 2)
print(x1 * 2)
2.2.数组和数组的计算(对应位置做计算,不同于数学中的矩阵)
# 2.数组和数组的计算(对应位置做计算,不同于数学中的矩阵)
y1 = np.arange(24).reshape((4, 6))
y2 = np.arange(24).reshape((4, 6))
print(y1)
print(y2)
print(y1 + y2)
print(y1 * y2)
*注意:不同形状的 多维数组 不能计算,例如:
z1 = np.arange(24).reshape((4, 6))
z2 = np.arange(30).reshape((3, 10))
但是,行数或列数相同的 一维数组 和 多维数组 可以进行计算
行数相同 或 列数相同
如下列栗子:
c1 = np.arange(24).reshape(4, 6)
c1 = np.arange(0, 6)
c2 = np.arange(24).reshape(4, 6)
c2 = np.arange(4).reshape(4, 1)
3.数组中的轴
g1 = np.arange(6).reshape(2, 3)
print(g1)
print(np.sum(g1, axis=0)) # [3 5 7]
print(np.sum(g1, axis=1)) # [ 3 12]
print(np.sum(g1)) # 15
4.数组的索引和切片
4.1.一维数组的索引和切片
q1 = np.arange(10)
print(q1)
# 冒号分隔切片参数 start:stop:step 来进行切片
print(q1[2:7:2])
# 只放置一个参数,将返回与该参数相对应的单个元素
print(q1[2])
# 如果为[2:],表示从该索引开始以后的所有项都将被提取
print(q1[2:])
4.2.多维数组的索引和切片
总结: 数组[行(可以使用切片) , 列(可以使用切片)]
q2 = np.arange(24).reshape(4, 6)
print(q2)
# 取一行
print(q2[1])
print(q2[1,:])
# 取连续的多行
print(q2[1:])
print(q2[1:3,:])
# 取不连续的多行
print(q2[[0,2,3]])
print(q2[[0,2,3],:])
# 取一列
print(q2[:,1])
# 取连续的多列
print(q2[:,1:])
# 取不利连续的多列
print(q2[:,[0,2,3]])
# 取一个值,例如:3行4列
print(q2[3,4])
# 取多个不连续的值(行和列取的数相对应,相当于取的是(0,0),(1,1)(1,3))
print(q2[[0,1,1],[0,1,3]])
5.数组中数值的修改
b = np.arange(24).reshape(4, 6)
print(b)
# 修改某一行的值
b[1, :] = 0
print(b)
# 修改某一列的值
b[:, 1] = 0
print(b)
# 修改连续多行
b[2:, :] = 999
print(b)
# 修改连续多列
b[:, 4:] = 1000
print(b)
# 修改多行多列,取第二行到第四行,第三列到底五列
b[1:4, 2:5] = 22
print(b)
# 修改多个不相邻的点
b[[0, 1], [0, 3]] = 33
print(b)
# 可以根据条件修改,比如小于22的修改掉
b[b < 22] = 0
print(b)
# 使用逻辑判断
b[(b > 22) & (b < 1000)] = 0
print(b)
"""
逻辑运算:
与 &
或 |
非 ~
"""
# 拓展:三木运算
height = np.array([[160, 183], [158, 169], [167, 190]])
result_height = np.where(height > 180, '高', '矮')
print(result_height)
6.数组的添加、删除和去重
7.numpy的计算
import numpy as np
# 获取所有数据的最大值
score = np.arange(24).reshape(4, 6)
print(score)
result_max = np.max(score)
print(result_max)
# 获取某一个轴上的数据最大值
result_max_0 = np.max(score, axis=0)
result_max_1 = np.max(score, axis=1)
print(result_max_0)
print(result_max_1)
# 获取某一个轴上的数据最小值
result_min_0 = np.min(score, axis=0)
result_min_1 = np.min(score, axis=1)
print(result_min_0)
print(result_min_1)
# 获取平均值
result_avg = np.mean(score)
result_avg_0 = np.mean(score, axis=0)
print(result_avg)
print(result_avg_0)
# 求和
sum = np.sum(score, axis=0)
print(sum)
8.数组中的nan和inf
nan:表示缺失的数据
inf:表示无穷大,需要使用float(‘inf’)来转化。另:-inf表示无穷小
1.np.nan != np.nan 结果是True
2.可以使用np.count_nozero() 来判断非0的个数
以nan为例,下面是nan的一个例子:
import numpy as np
t = np.arange(24).reshape(4, 6).astype(float)
t[2, 3:] = np.nan
print(t)
# 遍历数组的每一列
for i in range(t.shape[1]):
# 获取当前列
temp_col = t[:, i]
# 判断当前列是否包含nan数据
nonzero_num = np.count_nonzero(temp_col != temp_col)
# 条件成立,说明有这一列有nan
if nonzero_num != 0:
# 获取当前列中不是nan的数据
temp_col_not_nan = temp_col[temp_col == temp_col]
# 将nan替换为这一列的avg值
temp_col[np.isnan(temp_col)] = np.mean(temp_col_not_nan)
print(t)
9.二维数组的转置
t2 = np.arange(12).reshape(3, 4)
# 转置
t3 = t2.T
print(t2)
print(t3)