numpy简单来说就是python的C版数组实现,因为python原生列表虽然好使,但是生成大量数据时开销很大,而numpy是基于C的,生成大量数组非常简单,而且操作他们速度非常快.
由于numpy是基于C的,所以numpy是一种强类型的,当然numpy是可以判断数组里面是数据类型,但是我们可以显示声明他们,dtype是声明的参数,一般我们通过下面的方式简单声明一个narray #
import numpy as np
arr = np.array([1, 2, 3], dtype=np.int32)
numpy还有一个强大的地方是多维数组,numpy对多维数组的支持很好.只要简单的使用嵌套序列就能被转化成多维数组.
比如
arr2 = np.array(1, 2)
numpy另一个强大的地方是矢量化,这对于科学计算来说非常有用 #
比如前面的arr
,
我们可以简单使用
arr3 = arr * arr
得到另外一个序列 [1, 4, 9]
,数组间的运算应用到了元素级.
numpy之所以成为数据分析的基本数据结构,还在用取数据的灵活性 #
对于一维数组来说,python自身的列表就支持切片处理,numpy不仅支持切片处理,还支持列表取出,比如:
>>> num = np.arange(10)
>>> num[3, 1, 0](3,%201,%200)
array([3, 1, 0])
在一维数组里面这个并没有什么优势,因为我们可以通过数据简单一个构造器[num[x] for x in [3, 1, 0]]
构造出来.
#
当但在多维数组我们使用构造器非常繁琐了, numpy使用了很多技术使我们很方便的取出多维数组
我们先创建一个多维数组 #
arr = np.arange(32).reshape((8, 4))
生成的arr是
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, 27],
[28, 29, 30, 31]])
现在像一维数组一样的取出数据
In[13]: arr[0, 3](0,%203)
Out[13]:
array([[ 0, 1, 2, 3],
[12, 13, 14, 15]])
我们取出了一个二维数组
试试用这个 #
In[14]: arr[arr > 8]
Out[14]:
array([ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 29, 30, 31])
我们取出一个一维数组,这个arr > 8
是也是一个二维数组对应原来数组的每个位置都有一个布尔值代替,当numpy判断得到是一个array数组时会广播每个值来判断是否获取,这个可比你用for循环快了很多.
array([[False, False, False, False],
[False, False, False, False],
[False, True, True, True],
[ True, True, True, True],
[ True, True, True, True],
[ True, True, True, True],
[ True, True, True, True],
[ True, True, True, True]], dtype=bool)
numpy很善于处理不同的选择,当你直接给一个数组时,如上面的arr[[0, 3, 4]]
,它默认第二维为全部选择也就是想当与arr[[0, 3, 4], :]
,当你给确定的值时,他就会在第二维上取响应的值,比如
#
arr[0, 3, 4](0,%203,%204)
从上面你可以看到,如果第二维你每个都想取第二个,你可以直接写一个整数就行,numpy会广播过去,假如想你分别再第一维的每个上分别对应取哪个你就可以用数组来分别选择.
有时候我们想在二维数组上面取出一个矩形块,直接使用 arr[[0, 3, 4], [1, 2, 3]]
只能取出二维数组矩形块的对角线,我们这时候就可以先取出第一维的矩形列,然后再在取出的列中取出矩形行
#
arr[0, 3, 4](0,%203,%204)[:, [1, 2, 3]]
当然我们还可以用二维数组来取出数据
arr0, 1, 2, 3]
[[0], [3], [4]]
代表第一维的1, 4, 5列, [[1, 2, 3]]
代表第二维的2, 3, 4行.
numpy给我们提供一个函数将一维数组转换成二维数组我们可以简单使用 #
np.ix_([0, 3, 4], [1, 2, 3])
生成二维数组,这样我们使用
arr[np.ix_([0, 3, 4], [1, 2, 3])]
就可以取出矩形块了.