NumPy,是Numerical Python的简称,它是目前Python数值计算中最为重要的基础包.大多数计算包(包括pandas)都提供了基于NumPy的科学函数功能,将NumPy的数组对象作为数据交换的通用语.
- numpy的算法库是使用C语言写的,所以numpy的速度比python其他内置序列更快,可以快到10到100陪左右,并且使用的内存也更少.
- numpy的核心特征之一就是N-维数组对象-ndarray,ndarray是python中的一个快速,灵活的大型数据集容器。数组允许你使用类似标量的操作语法在整块数据上进行科学计算.
>>>import numpy as np
>>>arr = np.random.randn(2,3)
>>>print(type(arr))
>>>print(data)
[[-1.23217596 0.87912426 -0.28587639]
[-0.41863888 2.48746006 -0.25920674]]
>>>print(arr*10)
[[-12.32175956 8.79124263 -2.85876385]
[ -4.18638876 24.87460064 -2.59206742]]
>>>print(data+arr*10)
[[-13.55393552 9.67036689 -3.14464024]
[ -4.60502763 27.3620607 -2.85127416]]
!!! 需要注意的是,ndarray包含的每一个元素都是相同的类型.
- ndarray对象有一个shape属性,表示数组每一维的元素个数。
>>>print(arr.shape)
(2, 3) -- 第一维2个元素,第二维3个元素
- 每一个ndarray对象还有一个dtype属性,用来描述数组元素的数据类型
>>>print(arr.dtype)
float64
- 生成ndarray对象
>>>list1 = [1, 2, 3, 4, 5]
>>>a = np.array(list1)
>>>print(a)
[1 2 3 4 5]
>>>list2 = [(1, 2, 3), (4, 5)]
>>>b = np.array(list2)
>>>print(b)
[(1, 2, 3) (4, 5)]
>>>print(b.shape) --- 因为第二维度长度不一样,所以ndarray显示只有一个维度
(2,)
>>>list3 = [(1, 2, 3), (4, 5, 6)]
>>>c = np.array(c)
>>>print(c)
[[1 2 3]
[4 5 6]]
>>>print(c.shape)
(2, 3)
- ndarray对象有一个ndim属性表示数组的维数
>>>print(c.ndim) --- 不是最外面数组的长度,是维数
2
- numpy内建函数arange()
>>>a = np.arange(13)
>>>print(type(a))
>>>print(a)
[ 0 1 2 3 4 5 6 7 8 9 10 11 12]
- 数组生成函数
array() --- 将传入的序列转换为ndarray
asarray() --- 将输入转换为ndarray,但如果输入已经是ndarray,则不再复制
arange() --- 将一个范围转换为一个数组
ones() --- 根据给定的形状和数据类型生成全1的数组
ones_like() --- 根据给定的数组根据形状生成一个形状一样的全1的数组
zeros() --- 根据给定的形状和数据类型生成全1的数组
zeros_like() --- 根据给定的数组根据形状生成一个形状一样的全0的数组
empty() --- 根据给定的形状生成一个没有初始化数值的空数组
empty_like() --- 根据给定的数组根据形状生成一个形状一样但没有初始化的空数组
full() --- 根据给定的形状和数据类型生成指定数值的数组
full_like() --- 根据给定的数组根据形状生成一个形状一样但内容是指定数值的数组
eye(), indentity() --- 生成一个N x N特征矩阵(对角线位置都是1,其余位置都是0)
- 可以使用astype()方法显示转换数组的数据类型
>>>print(a.dtype)
int32
>>>b = a.astype(np.float64) --- 会生成一个新的数组
>>>print(b.dtype)
float64
- numpy数组算术(两个数组的尺寸必须一样)
>>>arr = np.array([[1, 2, 3], [4, 5, 6]])
>>>print(arr)
[[1 2 3]
[4 5 6]]
>>>arr2 = arr*arr
>>>print(arr2) ---- 一一对应相乘,不是矩阵相乘
[[ 1 4 9]
[16 25 36]]
>>>print(arr2-arr)
[[ 0 2 6]
[12 20 30]]
>>>arr3 = np.array([[2, 2], [3, 3]])
>>>print(arr3)
[[2 2]
[3 3]]
>>>print(arr3*arr)
ValueError: operands could not be broadcast together with shapes (2,2) (2,3)
>>>print(arr3-arr)
ValueError: operands could not be broadcast together with shapes (2,2) (2,3)
>>>print(arr2>arr)
[[False True True]
[ True True True]]
>>>print(1/arr)
[[1. 0.5 0.33333333]
[0.25 0.2 0.16666667]]