人工智能学习(21 数据分析:04-numpy数组)

为什么要学习numpy:1快速,2方便,科学计算的基础库。注意其处理的是数值型数据,字符串类型的数据是没有办法处理的(字符串数据一般使用pandas处理,后续会进行讲解)。

numpy的数组的创建

什么是numpy: 一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算
numpy创建数组(矩阵)
在这里插入图片描述
编写简单代码如下,我们就能创建一个numpy类型的数组。

import numpy as np
t1 = np.array([1,2,3,4,])
print(t1)
print(type(t1))

运行之后打印信息如下:

[1 2 3 4]
<class 'numpy.ndarray'>

可以发现,他和list的区别,首先类型不一样。然后就是打印出来没有“,”号了。其类型为numpy.ndarray类型。我们再添加代码:

t1 = np.array(range(10))
t2 = np.arange(10)
print(t1)
print(t2)

打印如下:

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

可以知道在np.array(range(10))与numpy中的np.arange(10)是一样的,继续添加代码如下:

print(t2.dtype)

打印如为int32,那么这种类型是什么类型呢?如下总结:
在这里插入图片描述
在创建数组的时候,我们可以指定数组成员的类型(一般我们是不用关心的,只有在需要考虑内存的时候才涉及类型的选择):

t4 = np.arange(10, dtype="float")
print(t4)
print(t4.dtype)
t4 = np.arange(10, dtype=float)
print(t4)
print(t4.dtype)
t4 = np.arange(10, dtype="i2")
print(t4)

可以看到,创建数据的时候,我们可以通过dtype参数指定数组的类型,并且可以直接传递类型,或者字符串形式的类型代码。

如果一个数组,在创建好了之后,我们还想修改他的数据类型,我们怎么去完成呢?添加如下代码:

t5 = t4.astype("int64")
print(t5)
print(t5.dtype)

打印信息如下:

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

代表类型转换完成,在python中我们可以编写如下代码:

t7 = np.array([random.random() for i in range(10)])
print(t7)
print(t7.dtype)

运行之后得到10个随机小数,然后我们使用numpy可以对该小数数组进行操作,添加如下代码:

t8 = np.round(t7,2)
print(t8)

打印信息如下:

[0.81 0.9  0.5  0.42 0.59 0.01 0.42 0.21 0.74 0.88]

可以看待,该数组值保留了最后两位,其使用的方法和python中round的用法一样。

数组的形状和计算

在numpy数组中,其数组有一个重要的属性,叫做数组的形状。形状代表的是他的维度。如通过:

t1 = np.arange(12)

创建出来的数组,为一个一维数组,
我们看下他的形状

print(t1.shape)

我们可以看到打印出:(12,),可以知道其为一个元组,该元组的长度,代表他所属的维度,可以知道其长度为1,所以他是一个一维数组,该数组共有12个元素。我们再做以下试验:

t2 = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12,]])
print(t2.shape)

得到打印信息如下:

(4, 3)

我们可以看到,其表示t2是一个2维数组(该元组的长度为2),并且这个二维数组是一个4行3列的数组。下面我们再做一个三维的试验

t3 = np.array([[[1,2,3],[4,5,6],[7,8,9],[10,11,12,]],
               [[1,2,3],[4,5,6],[7,8,9],[10,11,12,]],
               [[1,2,3],[4,5,6],[7,8,9],[10,11,12,]],
               [[1,2,3],[4,5,6],[7,8,9],[10,11,12,]],
               [[1,2,3],[4,5,6],[7,8,9],[10,11,12,]]])
print(t3.shape)
print(t3)

打印信息如下:

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

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

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

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

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

从打印来看(5, 4, 3),我们知道其为一个3位数组,他分成了5个块,并且每个块都是一个二维数组。一般来说,二维数组以上的维度我们很少使用,但是二维数组我们是经常使用的,所以需要熟悉掌握。

在定义完成一个数组的形状的时候,我们有可能在后续的编写中,需要其改变他的形状,这时候会涉及一个函数为reshape(),其用法介绍如下:

在这里插入图片描述

t4 = np.arange(12)
t5 = t4.reshape((3,4))
print(t5)

打印信息如下:

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

如上,我们可以知道t4肯定是一个一维,但是通过reshape方法之后,其变化成了一个二维数组,这里有注意,就是改变形状之后,其元素的个数是不能改变的,如t4中的元素为12个,那么reshape(3,4)改变形状之后也必须保证为12个,这里我们可以知道3*4=12,一般来说,只要reshape中所有的参数乘积为所有元素个数总和即可。

在前面的图示中,还有还有一个flatten函数,从名字上看,我们也能猜测到其功能为把一个多为数组变为一个平面数组,即一维数组,如下:

t3 = np.array([[[1,2,3],[4,5,6],[7,8,9],[10,11,12,]],
               [[1,2,3],[4,5,6],[7,8,9],[10,11,12,]],
               [[1,2,3],[4,5,6],[7,8,9],[10,11,12,]],
               [[1,2,3],[4,5,6],[7,8,9],[10,11,12,]],
               [[1,2,3],[4,5,6],[7,8,9],[10,11,12,]]])
t6 = t3.flatten() 
print(t6)

打印信息如下:

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

除了以上函数我们也可以使用reshape,不过此时需要我们计算出t3元素的个数,如:

t7 = t3.reshape((60,))
print(t7)

也能得到一样的打印信息。使用如下方法也一样:

t7 = t3.reshape((1,60))
print(t7)

表示为,这是一个二维数组,但是其只有一行,注意:该处为二维数组,打印如下:

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

我们可以发现外面多了一对中括号。

数组计算

numpy中的数组,是可以进行计算的,接着之前添加如下代码:

print(t2 + 2 )

打印信息如下:

[[ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]
 [12 13 14]]

其使用计算的时候,其或作用于数组的没一个数组(或者说元素),类似于广播,即法发送+2的广播给灭一个成员。其加减乘除都是同样的道理。
下面我们执行如下操作:

t5 = t1/0
print(t5)

打印信息如下:

[nan inf inf inf inf inf inf inf inf inf inf inf]

我们发现程序并没有运行错误,但是出现了一个警告,当然这并不影响我们进行计算。可以看到其计算的结果又两种:nan,inf。nan为0/0的结果,inf为一个数值除以0的结果。

nan翻译为英文为not num(不是数字),inf(infinite:无穷,无限),在numpy中0表示一个无限小的数,所以一个数字除以一个无限小的数,其结果为无穷。0/0其结果在numpy中不认为是一个数字。

下面我们对两个二维数字进行先加:

t5 = np.arange(24).reshape((4,6))
t6 = np.arange(100,124).reshape((4,6))
print(t5 + t6)

打印结果如下:

[[100 102 104 106 108 110]
 [112 114 116 118 120 122]
 [124 126 128 130 132 134]
 [136 138 140 142 144 146]]

可以发现,两个形状一样的数组是可以进行相加运算的,他们以一一对应的形式相加。乘除也是一样。我们在做以下试验:

t7 = np.arange(6)
t8 = np.arange(24).reshape((4,6))
print(t7 - t8)

打印结果如下

[[ 0  0  0  0  0  0]
 [ 6  6  6  6  6  6]
 [12 12 12 12 12 12]
 [18 18 18 18 18 18]]

我们发现其依然是可以进行计算的,t7为一个一维数组,即只有一行,然后其会与t8数组中每一行进行计算。因为他们的行的形状是一样额,所以可以进行计算,如我们再做如下操作:

t7 = np.arange(4).reshape(4,1)
t8 = np.arange(24).reshape((4,6))
print(t8 - t7)

我们可以发现,其依旧是可以计算的,只是此时按照列的方式进行计算。因为他们列的形状是一样的。

我们可以得出结论,两个数组的维度不一样,但是只要在某一个维度上,他们的形状相同,则能够进行计算。下面有一个问题:
在这里插入图片描述
怎么理解呢?
可以把维度指的是shape所对应的数字个数
那么问题来了:
shape为(3,3,3)的数组能够和(3,2)的数组进行计算么?(不能)
shape为(3,3,2)的数组能够和(3,2)的数组进行计算么?(能)

第一个共为333=27个元素,每次计算6个,是没有办法一一对应计算的。
第二个共为332=18个元素,每次计算6个,是可以计算完成的,并且其月(3,3),(2,3)都能进行计算。从多个方向出发,有兴趣的同学可以深究一下。

猜你喜欢

转载自blog.csdn.net/weixin_43013761/article/details/89817454