《利用python进行数据分析》学习笔记--Numpy(1)
ndarray -----Numpy的N维数组对象
所以创建数组的话,首先想到的就是Numpy里面的array函数
1、创建ndarry-列表的转换
import numpy as np data1 = [2,3,4,4.5,1] arr1 = np.array(data1) arr1 arr1.dtype 结果为 array([2. , 3. , 4. , 4.5, 1. ]) dtype('float64')
因此可以看到array函数会为新建的数组推断出一个比较合适的数据类型。
data2 = [[3,5,7,9],[2,4,6,8]] arr2 = np.array(data2) arr2 arr2.shape #数组的shape属性 ,本题中的为两行四列 arr2.ndim #数组的维度 结果为 array([[3, 5, 7, 9], [2, 4, 6, 8]]) (2, 4) 2
另外 zeros 和 ones 也可以创建指定长度的数组
默认均为浮点型数据,转换为其他类型(4,int)即可 np.zeros(10) np.ones((3,6)) np.empty((2,3,2))#大多数情况下,返回的是一些未初始化的垃圾值 结果为 array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) array([[1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1.], [1., 1., 1., 1., 1., 1.]]) array([[[1.06312567e-311, 2.47032823e-322], [0.00000000e+000, 0.00000000e+000], [8.48798316e-313, 2.46567317e+179]], [[5.89332333e-091, 1.68750157e-051], [8.26462072e-072, 3.83469119e+175], [3.99910963e+252, 2.90315913e-057]]])
一些其他的数组函数
asarray-----将输入数据转换为ndarray
arange-----返回数组形式的列表
ones_like----以另一个数组为参数,返回全1数组
zeros_like
empty_like
y = np.arange(3, dtype=float) y np.ones_like(y) 结果为 array([0., 1., 2.]) array([1., 1., 1.])
2、ndarray的数据类型
arr1 = np.array([2,3,4],dtype = np.float64) arr1.dtype 返回为 dtype('float64')
可见,dtype能将含有array的一块内存解释为特定数据类型的功能。
数值型dtype的命名方式为:类型名(float,int)+表示元素位长的数字
数据类型还可以做一些转换(astype):
arr = np.array([1.2,-2.3,4.0])
arr.astype (np.int32)
结果为
array([ 1, -2, 4])
调用astype,总会创建一个新的数组,即使新dtype和旧dtype相同
3、切片及索引
arr = np.arange(9) arr[5] arr[5:8] 返回为 5 array([5, 6, 7]) arr[5:8] = 10 arr 返回值为 array([ 0, 1, 2, 3, 4, 10, 10, 10, 8]) ``` 切片产生的数据作用在原始数组上,和列表不同,可通过arr[5:8].copy进行复制切片为副本。
arr = np.array([[[1,2,3],[4,5,6]], [[7,8,9],[10,11,12]]]) arr 返回值为 array([[[ 1, 2, 3], [ 4, 5, 6]], [[ 7, 8, 9], [10, 11, 12]]]) arr[0] 返回值为 array([[1, 2, 3], [4, 5, 6]]) arr[0]=25 arr 返回值为 array([[[25, 25, 25], [25, 25, 25]], [[ 7, 8, 9], [10, 11, 12]]]) arr[1,0,1] 返回值为 8 arr[1,:1] 返回值为 array([[7, 8, 9]]) 因此可见,:2 表示切割至第二轴,并且不包含第二轴 1 :表示从第一轴开始切割,至最后
4、布尔型索引
可以将一组数据中的每个数据一一对应字符型数据,就会产生一个布尔型数组,同样也能够产生布尔型索引,举例如下
import numpy as np names = np.array(['ming','hong','gang'}) data = randn(3,3) name data 返回值为 array(['ming', 'hong', 'gang'], dtype='<U4') array([[-1.85959055, 1.75769342, -1.39259477], [-0.86781481, -0.04533248, -0.09520978], [-0.22062221, -0.47521222, 0.14313158]]) 数组同样也可以进行比较运算,并且是矢量化的 names == 'ming' 返回为 array([ True, False, False]) 这个布尔型数组还可以用于数组索引 data[names == 'ming'] 返回为 array([[-1.85959055, 1.75769342, -1.39259477]]) data[names == 'ming',2] 返回为 array(-1.39259477)
还有其他的运算效果,其中包括,不等于(!=),或用负号进行否定;
以及多个布尔条件,和(&),或(|)
5、花式索引——Fancy indexing
利用整数数组进行索引
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]]) 输入 arr[[1,3,5,6],[0,2,1,3]] 返回为 array([ 4, 14, 21, 27])
可以发现返回值为(1,0)(3,2)(5,1)(6,3)
会与我们所想的不一样,应该返回的是矩阵的子集,依然为矩阵
arr[np.ix_([1,3,5,6],[0,2,1,3])] 返回为 array([[ 4, 6, 5, 7], [12, 14, 13, 15], [20, 22, 21, 23], [24, 26, 25, 27]])
6、数组转置和轴对换
数组转置用.T
arr = np.arange(6).reshape((2,3)) arr arr.T 返回为 array([[0, 1, 2], [3, 4, 5]]) array([[0, 3], [1, 4], [2, 5]])