Python NumPy新手必备入门教程

Python NumPy库的讲解

一些个人学习NumPy时的总结,不太全面,欢迎大家一起学习交流!

  1. 认识数组
  2. 创建数组
  3. 数组数据类型
  4. 数组运算
  5. 索引与切片
  6. 转置和轴对称
  7. NumPy 通用函数
  8. NumPy进行数据分析
  9. 线性代数模块
  10. 随机数
import numpy as np  # 导入numpy包

1. 认识数组

data1 = np.arange(12).reshape(3,4) # 创建一个3行4列的数组
print(data1)
print(data1.dtype)   # 数组元素类型
print(data1.ndim)  # 数组的维度个数,输出结果2表示二维数组
print(data1.shape)  # 数组的维度,输出结果(3,4),表示3行4列
print(data1.size)  # 数组元素个数,输出12,表示12个元素

结果

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
int32
2
(3, 4)
12

2. 创建数组

data2_1 = np.array([1,2,3])  # 创建一个一维数组
print(data2_1)
data2_2 = np.array([[1,2,3],[4,5,6]])  # 创建一个二维数组
print(data2_2)
print(np.ones((2,2)))  # 创建一个全1数组
print(np.zeros(10))  # 创建一个全0数组
print(np.empty((2,3,2)))  # 创建一个全空数组,每个值接近于零
print(np.arange(12))

结果

[1 2 3]

[[1 2 3]
 [4 5 6]]
 
[[1. 1.]
 [1. 1.]]
 
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

[[[5.11798224e-307 1.37961370e-306]
  [4.22795269e-307 9.34609790e-307]
  [6.23037657e-307 1.33511290e-306]]

 [[6.23045126e-307 1.11260348e-306]
  [1.37962049e-306 2.22521238e-306]
  [1.24611470e-306 1.11261095e-306]]]
  
[ 0  1  2  3  4  5  6  7  8  9 10 11]

3. 数组数据类型

data3_1 = np.array([[1,2,3],[4,5,6]])
print(data3_1.dtype)  # 查看数组数据类型

data3_2 = data3_1.astype(np.float64)
print(data3_2.dtype)  # 数据类型转换为float64

float_data3 = np.array([1.2,2.3,3.9])
int_data3 = float_data3.astype(np.int64)   # 从float64转为int64
print(int_data3)

str_data3 = np.array(['1','2','3'])
int_2_data = str_data3.astype(np.int64)  # 从str转为int64
print(int_2_data)

结果

int32
float64
[1 2 3]
[1 2 3]

4. 数组运算

data4_1 = np.array([[1,2,3],[4,5,6]])
data4_2 = np.array([[1,2,3],[4,5,6]])
print(data4_1+data4_2)   # 数组相加
print(data4_1*data4_2)   # 数组相乘
print(data4_1-data4_2)   # 数组相减
print(data4_1/data4_2)   # 数组相除
# 特殊情况:当a.shape != b.shape时,会触发数组广播
data4_3 = np.array([[0],[1],[2],[3]])
print(data4_3.shape)
data4_4 = np.array([1,2,3])
print(data4_4.shape)
print(data4_4+data4_3)
# 数组与标量间的运算
data4_5 = np.array([[1,2,3],[4,5,6]])
data4_6 = 10
print(data4_6+data4_5)
print(data4_6-data4_5)
print(data4_6*data4_5)
print(data4_6/data4_5)

结果

[[ 2  4  6]
 [ 8 10 12]]
 
[[ 1  4  9]
 [16 25 36]]
 
[[0 0 0]
 [0 0 0]]
 
[[1. 1. 1.]
 [1. 1. 1.]]
 
(4, 1)

(3,)
[[1 2 3]
 [2 3 4]
 [3 4 5]
 [4 5 6]]
 
[[11 12 13]
 [14 15 16]]
 
[[9 8 7]
 [6 5 4]]
 
[[10 20 30]
 [40 50 60]]
 
[[10.          5.          3.33333333]
 [ 2.5         2.          1.66666667]]

5. 索引和切片

data5_1 = np.empty((4,4))  # 创建一个空数组
for i in range(4):
    data5_1[i] = np.arange(i,i+4)   # 动态添加元素
print(data5_1)
print(data5_1[[0,2]])   # 获取索引为[0,2]的元素
# 布尔型
student_name = np.array(['Tom','Lily','Jack','Rose'])
student_score = np.array([[79,88,90],[89,90,92],[83,78,85],[78,76,80]])
print(student_score[student_name == 'Jack'])

结果

[[0. 1. 2. 3.]
 [1. 2. 3. 4.]
 [2. 3. 4. 5.]
 [3. 4. 5. 6.]]
[[0. 1. 2. 3.]
 [2. 3. 4. 5.]]
[[83 78 85]]

6. 转置和轴对称

data6_1 = np.arange(12).reshape(3,4)
print(data6_1)
print(data6_1.T)   # 使用T属性进行数组转置
data6_2 = np.arange(16).reshape((2,2,4))
print(data6_2)
print(data6_2.transpose(1,2,0))  # 使用transpose()方法对数组进行转置
print(data6_2.swapaxes(1,0))   # 使用swapaxes()方法对数组进行转置

结果

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]
[[[ 0  1  2  3]
  [ 4  5  6  7]]

 [[ 8  9 10 11]
  [12 13 14 15]]]
[[[ 0  8]
  [ 1  9]
  [ 2 10]
  [ 3 11]]

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

 [[ 4  5  6  7]
  [12 13 14 15]]]

7. NumPy 通用函数

data7_1 = np.array([4,9,16])
print(np.sqrt(data7_1))   # 开方
print(np.abs(data7_1))    # 绝对值
print(np.square(data7_1))  # 平方
data7_2 = np.array([1,2,3])
print(np.add(data7_2,data7_1))  # 求和
print(np.multiply(data7_1,data7_2))  # 乘积
print(np.maximum(data7_1,data7_2))  # 最大值比较
print(np.greater(data7_1,data7_2))  # 执行元素级的比较操作

结果

[2. 3. 4.]
[ 4  9 16]
[ 16  81 256]
[ 5 11 19]
[ 4 18 48]
[ 4  9 16]
[ True  True  True]

8. NumPy进行数据分析

# 条件逻辑转为数组运算
arr_x = np.array([1,5,7])
arr_y = np.array([2,6,8])
arr_con = np.array([True,False,True])
result = np.where(arr_con,arr_x,arr_y)
print(result)
# 数组统计运算
arr8_1 = np.arange(18)
print(arr8_1.sum())  # 求和
print(arr8_1.mean())   # 求平均值
print(arr8_1.argmin())  # 求最小值索引
print(arr8_1.cumsum())  # 累计和
print(arr8_1.cumprod())  # 累计积
arr8_2 = arr8_1 - np.ones(18)
diff_x = np.diff(arr8_2)
print(diff_x)   # 差分
print(np.floor([-0.6,-1.4,-0.1,-1.8,0.1,1.4,1.7]))  # 向左取整
print(np.ceil([1.2,1.5,1.8,2.1,2.0,-0.5,-0.6,-0.3]))  # 向右取整
arr8_3 = np.array([[1,0],[2,-2],[-2,1]])
print(np.where(arr8_3 > 0, arr8_3, 0))  # 小于0的值用0填充,大于0的数不变
# 数组排序
arr8_4 = np.array([[6,2,7],[3,6,2],[4,3,2]])
arr8_4.sort() # 默认axis=1按行排序,axis=0按列排序
print(arr8_4)
# 检索数组元素
arr8_5 = np.array([[1,-2,-7],[-3,6,2],[-4,3,2]])
print(np.any(arr8_5 > 0))   # 数组元素是否有1个大于0
print(np.all(arr8_5 > 0))   # 数组元素是否全部大于0
# 唯一化及其他集合逻辑
arr1_8_6 = np.array([1,1,2,2,3])
print(np.unique(arr1_8_6))   # 去重
print(np.in1d(arr1_8_6,[1,2]))  # 在序列B中寻找与序列A相同的值,返回逻辑值的向量

结果

[1 6 7]
153
8.5
0
[  0   1   3   6  10  15  21  28  36  45  55  66  78  91 105 120 136 153]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[-1. -2. -1. -2.  0.  1.  1.]
[ 2.  2.  2.  3.  2. -0. -0. -0.]
[[1 0]
 [2 0]
 [0 1]]
[[2 6 7]
 [2 3 6]
 [2 3 4]]
True
False
[1 2 3]
[ True  True  True  True False]

9. 线性代数模块

arr9_x = np.array([[1,2,3],[4,5,6]])
arr9_y = np.array([[1,2],[3,4],[5,6]])
print(arr9_x.dot(arr9_y))  # 矩阵乘积

结果

[[22 28]
 [49 64]]

10. 随机数

arr10_1 = np.random.rand(3,3)  # 随机生成一个二维数组
print(arr10_1)
arr10_2 = np.random.rand(2,3,3)  # 随机生成一个三维数组
print(arr10_2)
print(np.random.seed(0))  # 生成随机数的种子
print(np.random.rand(5))  # 随机生成包含5个元素的浮点数组

结果

[[0.02875439 0.09168945 0.58070312]
 [0.7946155  0.41234354 0.47758627]
 [0.82299928 0.18792629 0.11579902]]
[[[0.62330223 0.57719336 0.40600738]
  [0.74697747 0.81377438 0.56935433]
  [0.12140782 0.35099371 0.90887829]]

 [[0.97748761 0.01659295 0.65731549]
  [0.47680095 0.6328054  0.23013741]
  [0.09387235 0.99151354 0.34342458]]]
None
[0.5488135  0.71518937 0.60276338 0.54488318 0.4236548 

个人学习的一些小结与心得,未经允许,请勿转载!欢迎大家一起交流学习!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

richardxp888

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

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

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

打赏作者

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

抵扣说明:

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

余额充值