numpy学习

一:什么是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]]

  未完待续……

 

   

 

 

 

 

 

 

   

转载于:https://www.cnblogs.com/huiyichanmian/p/11154249.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值