一:什么是numpy?
一个在Python中做科学计算的基础库,重在数值计算,也是大部分Python科学计算库的基础库,多用于大型、多维数组上执行数值运算。
二:numpy创建数组:
创建数组:
import numpy as np a = np.array([1,2,3,4,5]) b = np.array(range(1,6)) c = np.arange(1,6)
In [5]: a,b,c
Out[5]: (array([1, 2, 3, 4, 5]), array([1, 2, 3, 4, 5]), array([1, 2, 3, 4, 5]))
三者内容相同,注意arange和range的区别
np.arange的用法:arange([start,]stop[, step], dtype=None)
数组的类别:
In [6]: type(a)
Out[6]: numpy.ndarray
数据的类型:(不同的操作系统有不同的数据类型,比如在mac下运行,结果为‘int64’)
In [7]: a.dtype Out[7]: dtype('int32')
常见的数据类型:
数据类型的操作:
1.指定创建数组的数据类型:
In [8]: a = np.array([1,0,1,0],dtype=np.bool) # 或使用dtype="?" In [9]: a Out[9]: array([ True, False, True, False])
2.修改数组的数据类型:
In [10]: a.astype("i1") # 或使用a.satype(np.int8) Out[10]: array([1, 0, 1, 0], dtype=int8)
3.修改浮点型小数位数
In [19]: a = np.random.rand(10) In [20]: a Out[20]: array([0.34578999, 0.07757876, 0.73983465, 0.47505215, 0.0042425 , 0.23008797, 0.02363245, 0.51436831, 0.87429751, 0.53408665])
In [22]: np.round(a,2)
Out[22]: array([0.35, 0.08, 0.74, 0.48, 0. , 0.23, 0.02, 0.51, 0.87, 0.53])
三:数组的形状
In [31]: a = np.array([[3,4,5,6,7],[4,5,6,7,8]]) In [32]: a Out[32]: array([[3, 4, 5, 6, 7], [4, 5, 6, 7, 8]])
1.查看数组形状:
In [33]: a.shape
Out[33]: (2, 5)
2.修改数组形状
In [34]: a.reshape(5,2) Out[34]: array([[3, 4], [5, 6], [7, 4], [5, 6], [7, 8]])
In [36]: b = a.reshape(5,2) In [37]: b Out[37]: array([[3, 4], [5, 6], [7, 4], [5, 6], [7, 8]])
把数组转为1维数组:
In [43]: b.flatten()
Out[43]: array([3, 4, 5, 6, 7, 4, 5, 6, 7, 8])
四: 数组和数的计算
In [44]: a = np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]]) In [45]: a Out[45]: array([[3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9]])
1.加法运算
In [46]: a + 2 Out[46]: array([[ 5, 6, 7, 8, 9, 10], [ 6, 7, 8, 9, 10, 11]])
2.乘法运算
In [47]: a * 2 Out[47]: array([[ 6, 8, 10, 12, 14, 16], [ 8, 10, 12, 14, 16, 18]])
这个一个numpy的广播机制造成的,在运算过程中,加减乘除的值被广播到所有元素的上面。
五:数组和数组的运算
In [44]: a = np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]]) In [45]: a Out[45]: array([[3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9]]) In [48]: b = a*2 In [49]: b Out[49]: array([[ 6, 8, 10, 12, 14, 16], [ 8, 10, 12, 14, 16, 18]])
1.数组和数组的加法运算
In [50]: a + b Out[50]: array([[ 9, 12, 15, 18, 21, 24], [12, 15, 18, 21, 24, 27]])
2.数组和数组的乘除运算
In [51]: a*b Out[51]: array([[ 18, 32, 50, 72, 98, 128], [ 32, 50, 72, 98, 128, 162]])
3.不同维度的数组运算
In [52]: c = np.array([[1,2,3,4,5,6],[2,3,4,5,6,7],[3,4,5,6,7,8]]) In [53]: c Out[53]: array([[1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [3, 4, 5, 6, 7, 8]])
In [54]: a + c --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-54-e81e582b6fa9> in <module> ----> 1 a + c ValueError: operands could not be broadcast together with shapes (2,6) (3,6)
但是存在下面情况情况:
a 为两行六列的数组
In [55]: a Out[55]: array([[3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9]])
b 为一行六列的数组
In [56]: b = np.arange(1,7) In [57]: b Out[57]: array([1, 2, 3, 4, 5, 6])
a - b
In [58]: a-b Out[58]: array([[2, 2, 2, 2, 2, 2], [3, 3, 3, 3, 3, 3]])
a*b
In [59]: a*b Out[59]: array([[ 3, 8, 15, 24, 35, 48], [ 4, 10, 18, 28, 40, 54]])
a为两行六列的数组,b为两行一列的数组
In [60]: a Out[60]: array([[3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9]]) In [61]: b = np.array([[2],[3]]) In [62]: b Out[62]: array([[2], [3]])
a + b
In [63]: a+b Out[63]: array([[ 5, 6, 7, 8, 9, 10], [ 7, 8, 9, 10, 11, 12]])
a*c | b*a
In [65]: a*b Out[65]: array([[ 6, 8, 10, 12, 14, 16], [12, 15, 18, 21, 24, 27]])
In [67]: b*a
Out[67]:
array([[ 6, 8, 10, 12, 14, 16],
[12, 15, 18, 21, 24, 27]])
为什么呢?广播原则:
如果两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相等或其中一方的长度为1,则认为它们是广播兼容的,广播会在缺失和(或)长度为1的维度上进行。
可以把维度理解为shape所对应的数字个数。
那么问题来了:
1.shape(3,3,3)的数组能和(3,2)的数组进行计算吗? 不能
In [68]: a = np.arange(27).reshape(3,3,3) In [69]: a Out[69]: array([[[ 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]]]) In [70]: b = np.arange(6).reshape(3,2) In [71]: b Out[71]: array([[0, 1], [2, 3], [4, 5]]) In [72]: a + b --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-72-bd58363a63fc> in <module> ----> 1 a + b ValueError: operands could not be broadcast together with shapes (3,3,3) (3,2)
2.shape(3,3,3)的数组能和(3,2)的数组进行计算吗? 可以
In [76]: a Out[76]: array([[[ 0, 1], [ 2, 3], [ 4, 5]], [[ 6, 7], [ 8, 9], [10, 11]], [[12, 13], [14, 15], [16, 17]]]) In [77]: b Out[77]: array([[0, 1], [2, 3], [4, 5]]) In [78]: a + b Out[78]: array([[[ 0, 2], [ 4, 6], [ 8, 10]], [[ 6, 8], [10, 12], [14, 16]], [[12, 14], [16, 18], [20, 22]]])
六: 轴(axis)
在numpy中可以理解为方向,使用0,1,2……等数字表示,对于一个一维的数组,只有一个0轴,对于二维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2,3)),有0,1,2轴
有了轴的概念,我们计算会更加方便,比如计算一个2维数组的平均值,必须制定计算哪个方向数字的平均值。
那么问题来了,在前面的知识中,轴在哪里?
回顾np.arange(10).reshape(2,5),reshape中的2表示0轴长度(包含数据的条数)为2,1轴长度为5,2X5一共十条数据。
二维数组中的轴:
三维数组中的轴:
七:numpy读取数据
注意期中添加delimiter和dytpe以及unpack的效果
delimiter: 指定边界符号是什么,不指定会导致每行数据为一个整体的字符串而报错,
dtype:默认情况下对于较大的数据会将其变为科学计数的方式
unpack:默认为False(0),默认情况下,有多少条数据就有多少行,为True(1)的情况下,每一列的数据会组成一行,原始数据有多少列,加载出来的数据就有多少行,相当于转置的效果。
那么问题来了,何为转置呢?
转置是一种变化,对于numpy中的数组来说,就是在对角线方向交换数据,目的也是为了更方便的处理数据
In [79]: t = np.arange(18).reshape(3,6) In [80]: t Out[80]: array([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17]]) In [81]: t.transpose() Out[81]: array([[ 0, 6, 12], [ 1, 7, 13], [ 2, 8, 14], [ 3, 9, 15], [ 4, 10, 16], [ 5, 11, 17]]) In [82]: t.swapaxes(1,0) Out[82]: array([[ 0, 6, 12], [ 1, 7, 13], [ 2, 8, 14], [ 3, 9, 15], [ 4, 10, 16], [ 5, 11, 17]]) In [83]: t.T Out[83]: array([[ 0, 6, 12], [ 1, 7, 13], [ 2, 8, 14], [ 3, 9, 15], [ 4, 10, 16], [ 5, 11, 17]])
动手:
现在有一个英国和美国各自youtube1000多个视频的点击,喜欢,不喜欢,评论数量(['views','likes','dislikes','comment_total'])的csv文件,运用刚刚所学的只是,我们尝试对其操作。
import numpy as np uk_file_path = r'F:\code\study_numpy\youtube_video_data\GB_video_data_numbers.csv' us_file_path = r'F:\code\study_numpy\youtube_video_data\US_video_data_numbers.csv' t1 = np.loadtxt(uk_file_path, delimiter=',', dtype='int', unpack=True) # unpack转置 t2 = np.loadtxt(uk_file_path, delimiter=',', dtype='int') print(t1) print('*'*20) print(t2)
[[7426393 494203 142819 ... 109222 626223 99228] [ 78240 2651 13119 ... 4840 22962 1699] [ 13548 1309 151 ... 35 532 23] [ 705 0 1141 ... 212 1559 135]] ******************** [[7426393 78240 13548 705] [ 494203 2651 1309 0] [ 142819 13119 151 1141] ... [ 109222 4840 35 212] [ 626223 22962 532 1559] [ 99228 1699 23 135]]
未完待续……