最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

天天新动态:Numpy基本使用方法

来源:博客园


(相关资料图)

Numpy基本使用方法

第一节

创建数组

import numpy as npimport random# 创建数组a = [1, 2, 3, 4, 5]a1 = np.array(a)print(a1)  # [1 2 3 4 5]b = range(10)b1 = np.array(b)print(b1)  # [0 1 2 3 4 5 6 7 8 9]

数组的类名

# 数组的类名print(type(a1))  # print(type(b1))  # 

数据的类型

# 数据的类型print(a1.dtype)  # int32c1 = np.array([random.random() for i in range(10)])print(c1)# [0.65076793 0.78410146 0.94405112 0.58741766 0.23018049 0.80708392 0.5297858  0.14736833 0.53402873 0.21310533]print(c1.dtype)  # float64d1 = np.array([True, False, False, True])print(d1.dtype)  # bool

指定数组类型

# 指定数组类型a2 = np.array(a, dtype=float)print(a2.dtype)  # float64a3 = np.array(a, dtype="float")print(a2.dtype)  # float64

修改数组类型

# 修改数组类型d2 = d1.astype(int)print(d2)  # [1 0 0 1]print(d2.dtype)  # int32a4 = a1.astype(dtype="float")print(a4)  # [1. 2. 3. 4. 5.]print(a4.dtype)  # float64

修改浮点型小数位

# 修改浮点型小数位print(c1)# 156 0.41847005 0.27127742 0.59553829 0.40378794 0.90308214 0.86897877 0.20906481 0.1832515]c2 = c1.round(2)  # 保留两位小数print(c2)# [0.35 0.78 0.93 0.63 0.81 0.15 0.95 0.21 0.29 0.48]

完整代码

import numpy as npimport random# 创建数组a = [1, 2, 3, 4, 5]a1 = np.array(a)print(a1)  # [1 2 3 4 5]b = range(10)b1 = np.array(b)print(b1)  # [0 1 2 3 4 5 6 7 8 9]# 数组的类名print(type(a1))  # print(type(b1))  # # 数据的类型print(a1.dtype)  # int32c1 = np.array([random.random() for i in range(10)])print(c1)# [0.65076793 0.78410146 0.94405112 0.58741766 0.23018049 0.80708392 0.5297858  0.14736833 0.53402873 0.21310533]print(c1.dtype)  # float64d1 = np.array([True, False, False, True])print(d1.dtype)  # bool# 指定数组类型a2 = np.array(a, dtype=float)print(a2.dtype)  # float64a3 = np.array(a, dtype="float")print(a2.dtype)  # float64# 修改数组类型d2 = d1.astype(int)print(d2)  # [1 0 0 1]print(d2.dtype)  # int32a4 = a1.astype(dtype="float")print(a4)  # [1. 2. 3. 4. 5.]print(a4.dtype)  # float64# 修改浮点型小数位print(c1)# 156 0.41847005 0.27127742 0.59553829 0.40378794 0.90308214 0.86897877 0.20906481 0.1832515]c2 = c1.round(2)  # 保留两位小数print(c2)# [0.35 0.78 0.93 0.63 0.81 0.15 0.95 0.21 0.29 0.48]

第二节

数组的形状

import numpy as np# 数组的形状a = np.array([[3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9]])print(a.shape)  # (2, 6) 2行6列

修改数组的形状

# 修改数组的形状a1 = a.reshape(3, 4)  # 修改为3行4列print(a1.shape)  # (3, 4) 3行4列print(a1)"""[[3 4 5 6] [7 8 4 5] [6 7 8 9]]"""print(a.shape)  # (2, 6) 修改数组形状会指向新的对象,不会修改原数组本身

把数据转换成一维数组

# 把数据转换成一维数组a2 = a.flatten()print(a2)  # [3 4 5 6 7 8 4 5 6 7 8 9]

数组的计算/广播机制,在运算过程中加减乘除的值被广播到所有元素上

# 数组的计算/广播机制,在运算过程中加减乘除的值被广播到所有元素上b = a*10print(b)  # [[30 40 50 60 70 80][40 50 60 70 80 90]]c = np.arange(20)print(c)  # [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]c1 = c.reshape(4, 5)print(c1)""" [[0  1  2  3  4] [5  6  7  8  9] [10 11 12 13 14] [15 16 17 18 19]] """d = np.array([1, 1, 1, 1, 1])d1 = d.reshape(1, 5)print(d1)  # [[1 1 1 1 1]] (1, 5)print(c1 - d1)""" 所有元素全部 -1,即所有行全部减d1这个1行5列的数组[[-1  0  1  2  3] [4  5  6  7  8] [9 10 11 12 13] [14 15 16 17 18]]  """# 广播的原则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。

完整代码

import numpy as np# 数组的形状a = np.array([[3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9]])print(a.shape)  # (2, 6) 2行6列# 修改数组的形状a1 = a.reshape(3, 4)  # 修改为3行4列print(a1.shape)  # (3, 4) 3行4列print(a1)"""[[3 4 5 6] [7 8 4 5] [6 7 8 9]]"""print(a.shape)  # (2, 6) 修改数组形状会指向新的对象,不会修改原数组本身# 把数据转换成一维数组a2 = a.flatten()print(a2)  # [3 4 5 6 7 8 4 5 6 7 8 9]# 数组的计算/广播机制,在运算过程中加减乘除的值被广播到所有元素上b = a*10print(b)  # [[30 40 50 60 70 80][40 50 60 70 80 90]]c = np.arange(20)print(c)  # [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]c1 = c.reshape(4, 5)print(c1)""" [[0  1  2  3  4] [5  6  7  8  9] [10 11 12 13 14] [15 16 17 18 19]] """d = np.array([1, 1, 1, 1, 1])d1 = d.reshape(1, 5)print(d1)  # [[1 1 1 1 1]] (1, 5)print(c1 - d1)""" 所有元素全部 -1,即所有行全部减d1这个1行5列的数组[[-1  0  1  2  3] [4  5  6  7  8] [9 10 11 12 13] [14 15 16 17 18]]  """# 广播的原则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。

第三节

读取CSV文件

import numpy as npus_file_path = "./youtube_video_data/US_video_data_numbers.csv"# 将文件对象通过numpy.loadtxt方法 实例化t2 = np.loadtxt(us_file_path, delimiter=",", dtype="int")print(t2)print(t2.shape)  # (1688, 4)

索引

# 取行print(t2[2])  # 取索引为2的行,即第三行""" [5845909  576597   39774  170708] """# 取连续的多行print(t2[2:])  # 取索引为2开始的所有行"""[[5845909  576597   39774  170708] [2642103   24975    4542   12829] [1168130   96666     568    6666] ... [ 142463    4231     148     279] [2162240   41032    1384    4737] [ 515000   34727     195    4722]]    """# 取不连续的多行print(t2[[2, 3, 4]])  # 取索引为2,3,4的行""""[[5845909  576597   39774  170708] [2642103   24975    4542   12829] [1168130   96666     568    6666]]"""# t2[2] = t2[2,] = t2[2, :] 效果是一样的,都是取索引为2的行# 取列print(t2[:, 0])  # 取索引为0的所有元素,即第一列""" [4394029 7860119 5845909 ...  142463 2162240  515000] """# 取连续多列print(t2[:, 2:])  # 取索引为2的列开始往后所有的列""" [[  5931  46245] [ 26679      0] [ 39774 170708] ... [   148    279] [  1384   4737] [   195   4722]] """# 取不连续的多行print(t2[:, [2, 3]])  # 取索引为2,3的列""" [[  5931  46245] [ 26679      0] [ 39774 170708] ... [   148    279] [  1384   4737] [   195   4722]] """# 取行和列交叉的值print(t2[2, 3])  # 取第二行和第三列交叉的值""" 170708 """# 取多个不相邻的点# 取出来的结果是(0,0) (2,1) (2,3)(行,列)print(t2[[0, 2, 2], [0, 1, 3]])""" [4394029  576597  170708] """

完整代码

import numpy as npus_file_path = "./youtube_video_data/US_video_data_numbers.csv"# 将文件对象通过numpy.loadtxt方法 实例化t2 = np.loadtxt(us_file_path, delimiter=",", dtype="int")print(t2)print(t2.shape)  # (1688, 4)# 取行print(t2[2])  # 取索引为2的行,即第三行""" [5845909  576597   39774  170708] """# 取连续的多行print(t2[2:])  # 取索引为2开始的所有行"""[[5845909  576597   39774  170708] [2642103   24975    4542   12829] [1168130   96666     568    6666] ... [ 142463    4231     148     279] [2162240   41032    1384    4737] [ 515000   34727     195    4722]]    """# 取不连续的多行print(t2[[2, 3, 4]])  # 取索引为2,3,4的行""""[[5845909  576597   39774  170708] [2642103   24975    4542   12829] [1168130   96666     568    6666]]"""# t2[2] = t2[2,] = t2[2, :] 效果是一样的,都是取索引为2的行# 取列print(t2[:, 0])  # 取索引为0的所有元素,即第一列""" [4394029 7860119 5845909 ...  142463 2162240  515000] """# 取连续多列print(t2[:, 2:])  # 取索引为2的列开始往后所有的列""" [[  5931  46245] [ 26679      0] [ 39774 170708] ... [   148    279] [  1384   4737] [   195   4722]] """# 取不连续的多行print(t2[:, [2, 3]])  # 取索引为2,3的列""" [[  5931  46245] [ 26679      0] [ 39774 170708] ... [   148    279] [  1384   4737] [   195   4722]] """# 取行和列交叉的值print(t2[2, 3])  # 取第二行和第三列交叉的值""" 170708 """# 取多个不相邻的点# 取出来的结果是(0,0) (2,1) (2,3)(行,列)print(t2[[0, 2, 2], [0, 1, 3]])""" [4394029  576597  170708] """

第四节

将数组中的nan更换为对应列的均值

import numpy as npt = np.arange(24)t1 = t.reshape(4, 6).astype("float")t1[1, 2:] = np.nanprint(t1)print("*"*100)for i in range(t1.shape[1]):    temp_col = t1[:, i]    # nan == nan -> Ture    # np.count_nonzero(temp_col != temp_col)返回的是对布尔类型的统计True=1,False=0、    nan_num = np.count_nonzero(temp_col != temp_col)    # print(temp_col != temp_col)    """     [False False False False]   0    [False False False False]   0      [False False False False]   0    [True False False False]    1    [True False False False]    1    [True False False False]    1     """    if nan_num != 0:  # 不为零则说明这一列里面有nan        # 将有nan的列中的不为nan的元素赋值给temp_not_nan_col        temp_not_nan_col = temp_col[temp_col == temp_col]        # 选中当前为nan的位置,把值赋值为不为nan的均值        temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()print(t1)"""result[[ 0.  1.  2.  3.  4.  5.] [ 6.  7. nan nan nan nan] [12. 13. 14. 15. 16. 17.] [18. 19. 20. 21. 22. 23.]]****************************************************************************************************[[ 0.  1.  2.  3.  4.  5.] [ 6.  7. 12. 13. 14. 15.] [12. 13. 14. 15. 16. 17.] [18. 19. 20. 21. 22. 23.]]"""

第五节

numpy与matplotlib结合

美国YTB视频评论的直方图

import numpy as npfrom matplotlib import pyplot as pltus_file_path = "./youtube_video_data/US_video_data_numbers.csv"t_us = np.loadtxt(us_file_path, delimiter=",", dtype=int)# 取评论的数据t_us_comments = t_us[:, -1]# 选择比5000小的数据t_us_comments = t_us_comments[t_us_comments <= 1511]# 组距d = 50# 组数 = (max-min)//组距bin_nums = (t_us_comments.max() - t_us_comments.min()) // 5print(bin_nums)# 绘图plt.figure(figsize=(20, 8), dpi=80)plt.hist(t_us_comments, bin_nums)plt.grid(alpha=0.4)plt.show()

英国YTB视频评论和喜欢的散点图

import numpy as npfrom matplotlib import pyplot as pltuk_file_path = "./youtube_video_data/GB_video_data_numbers.csv"t_uk = np.loadtxt(uk_file_path, delimiter=",", dtype=int)# 选择喜欢的书比50万小的数据t_uk = t_uk[t_uk[:, 1] <= 500000]# 错误写法t_uk = t_uk[: , 1] <= 500000 这种写法反馈的是bool类型# 分别取出喜欢的列,和评论的列t_uk_comment = t_uk[:, -1]t_uk_like = t_uk[:, 1]# 绘图展示plt.figure(figsize=(20, 8), dpi=80)plt.scatter(t_uk_like, t_uk_comment)plt.show()

关键词: 数组类型 一维数组 不连续的