Python数据分析常用库Numpy(二)

mac2022-06-30  25

五.深入理解numpy

1.数据浅拷贝

#定义一个数组 mi_casa = np.array([-45,-31,2,25,51,99]) #直接给新的变量 赋值为刚才的数组 su_casa = mi_casa 查看是否指向同一个变量与是否所有元素完全相同 可以看到是同一块内存空间且值相同 再确认一下地址是否相同 确实两个变量的内存地址完全相同 修改一个变量的值 看另一个会不会改变#未改变的值:mi_casa[0] =2:array([ True, True,True, True, True, True], dtype=bool) mi_casa[0] =2 #修改其中一个元素的值 值确实都改变了 所以直接赋值是浅拷贝 只是两个变量指向同一块内存空间

2.数据深拷贝

#定义一个数组 tree_house = np.array([-45,-31,2,25,51,99]) #使用np.copy复制 dog_house = np.copy(tree_house)

查看一下两个内存地址是否相同

地址不同 再改变其中一个变量的值 看另一个是否会变

修改一个 另一个变量的值没有发生改变 所以一般情况都是使用np.copy

3.数据视图View

tree_house = np.array([-45,-31,2,25,51,99]) #在给变量直接复制时 用.view()可以修改shape 但不改变原有对象的shape farm_house = tree_house.view() #修改复制复制得到对象的shape farm_house.shape=(2,3) 查看原有对象shape是否改变 这种方式也是浅拷贝 所以所以改变一个变量的值 另一个变量的值也会变tree_house[0] = 0 视图属性view()也是浅拷贝 但是可以有多个shape

4.数据添加之append

不含参数axis

a = np.array(np.arange(24)).reshape(2,3,4) b = np.append(a,[5,6,7,8])

可以看到拼接之后的都是一维数组 并且加在最后面

含参数axis

#定义两个多维数组 且维度与每个维度的大小必须相同 a = np.array(np.arange(24)).reshape(2,3,4) c = np.array(np.arange(24)).reshape(2,3,4)*10+3

#axis代表维度 从0开始算算作第一个维度 np.append(a,c,axis=0)

#第二个维度 这里代表的行 np.append(a,c,axis=1)

#第三个维度 这里代表的列 也是最后一个维度 np.append(a,c,axis=1)

5.数据添加之hstack和vstack

hstack#沿用上面的多维数组 a、c #'h'即"horizontal" 水平方向的意思 相当于append的axis=1 my_hay_stack = np.hstack((a,c)) vstack#'v'即"vertical" 垂直方向的意思 相当于append的axis=0 my_vay_stack = np.vstack((a,c))

6.数据添加之instert

#沿用上面的多维数组 c #有四个参数 c:要被增加的数组名、1:要增加在维度的第几个位置(从0开始)、555:要增加的值(可以为list)、axis:要增加的维度 after_insert_c = np.insert(c,1,555,axis=0)

#增加所有第二个维度 的第2个位置 np.insert(c,1,555,axis=1)

#增加所有第三个维度 第二个位置 np.insert(c,1,555,axis=2)

7.数据删除之delete

#定义一个多维数组d用来删除 d = np.array(np.arange(24)).reshape(2,3,4) * 10 + 3

#用法和insert类似 只是没有添加的值 #接受三个参数 d:要删除的数组、1:要删除维度的位置、axis:要删除的维度 #删除第一个维度 第二个位置 np.delete(d,1,axis=0)

#删除第二个维度 第二个位置 np.delete(d,1,axis=1)

8.数据合并之concatenate及stack

#定义两个数组 可以有部分维度不同 a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6]]) #合并np.concatenate() #接收两个参数 (a,b):要合并的多个数组、axis:维度(每个合并的数组都要该维度相同才可以合并) together = np.concatenate((a, b), axis=0)

append、insert、concatenate的区别:

np.append():必须要两个维度 且每个维度大小相同的数组才可以相加np.insert():不要求两个数组相加 指定一个维度与位置 把设定的值加上去np.concatenate():也是要求两个数组相加 但是不要求所有维度与大小相同 #验证合并后 是否改变合并后的值 会影响原先的值 together[1,1] = 555

合并之后是为合并的值又开辟了一块新的内存空间 两块内存空间互不影响

9.数据分离之split

不含参数axistemp = np.arange(6) #平均拆分成2个数组 np.split(temp,2) #平均拆分成3个数组 np.split(temp,3) 含参数axis#定义一个多维数组 before_split = np.random.randn(24).reshape(2,3,4) #np.split接受三个参数 before_split:要被拆分的数组、2:要被拆分维度拆分后的个数、axis:维度 #根据第一个维度 拆成2个数组 s0=np.split (before_split, 2, axis=0) #根据第二个维度 拆成3个数组 s1=np.split (before_split, 3, axis=1) #根据第三个维度 拆成4个数组 s2=np.split (before_split, 4, axis=2)

10.操作数据形状

reshape(直接调用array对象的该方法 重新定义shape)np.array(np.arange(12)).reshape((3,4)) 注意:使用 reshape()是返回一个值 并不是修改数组本事 是返回一个修改后的revel(浅拷贝的数组)my_34_array = np.array(np.arange(12)).reshape((3,4)) #使用revel获得一个浅拷贝的数组 my_ravel_array = my_34_array.ravel() #修改revel得到数组的shape 原数组的shape会改变 my_ravel_array.shape=(2,6) flat(不是数组 但是可以遍历)#定义一个数组 my_23_array=np.array(np.arange(6)).reshape((2,3)) #遍历 for n in my_23_array.flat: print(n)

11.快速排序及旋转数据

my_3_8_array = np.array(np.arange(24)).reshape((3,8)) #排序 会按照每一横行从大到小 还有每一横行第一个数字从大到小的顺序给每一行调换顺序 np.fliplr(my_3_8_array)

my_2_3_4_array = my_3_8_array.reshape((2,3,4)) #这个可以看到 按每一行第一个数字的大小 给行换了位置 np.fliplr(my_2_3_4_array)

12.数据类转置操作

flipud(给第一行和最后一行互换位置)

roll(把数组里的元素进行顺时针或者逆时针旋转)

一维

my_test_array=np.arange(5) #2为正数代表 从第数组第0个下标的位置顺时针旋转2个数字 那么数组原先最后的两个元素会转为前两个 np.roll(my_test_array,2)

为负数代表 从第数组第0个下标的位置逆时针旋转2个数字 那么数组原先最前面的两个元素会转为最后两个 np.roll(my_test_array,-2)

多维

#接着使用上面的my_2_3_4_array #多维旋转的话 会先数组变为一维 转完之后再变回多维 转法和一维相同 np.roll(my_2_3_4_array,-2)

rot90(旋转90度 这个和矩阵转置不同 只是单纯的旋转)

#接着使用上面的my_3_8_array #k=-1代表逆时针旋转一个90度 np.rot90(my_3_8_array,k=-1)

transpose:…

swapaxes:…

rollaxis:…

Summary:transpose、swapaxes、rollaxis Use np.transpose to permute all the axes at once. (Thanks to @jorgeca for pointing this out.)Use np.swapaxes to swap any two axes.Use np.rollaxis to “rotate” the axes.

13.覆瓦式数据拓展

tile

my_start_array = np.array(np.arange(6)) #tile接收两个参数 my_start_array:要拓展的数组、3:一个维度要拓展多少次的组合(只有一个维度的话就一个数字) #my_start_array在第一个维度拓展3次 np.tile(my_start_array,3)

#my_start_array在第一个维度拓展3次 第二个维度拓展1次 tile1 = np.tile(my_start_array,(3,1))

repeat

my_repeatable_array = np.array(np.arange(24)).reshape(2,3,4) #repeat接收三个参数 my_repeatable_array:要拓展的数组、2:每个元素总共出现的次数、axis:维度 #第一个维度后面的第一个维度 重复该第一个维度1次 np.repeat(my_repeatable_array,2,axis=0)

#第二个维度 紧接着的下一个第二个维度 重复该元素1次 np.repeat(my_repeatable_array,2,axis=1)

六.其他常用操作

1.自定义通用函数

import math #假设自定一个sigmoid函数 不用numpy的exp() def basic_sigmoid(x): s = 1/(1+math.exp(-x)) return s my_array = np.array(np.arange(6)) basic_sigmoid(my_array) #报错

import numpy as np #使用numpy的exp函数 def sigmoid(x): s = 1/(1+np.exp(-x)) return s my_array = np.array(np.arange(6)) sigmoid(my_array) #不报错 返回数组形式

import math #假设自定一个sigmoid函数 不用numpy的exp() def basic_sigmoid(x): s = 1/(1+math.exp(-x)) return s #加入nnmpy的自定义函数 此时返回一个泛型的函数 #参数basic_sigmoid:要改变的自定函数、1:接收的参数个数、1:返回的参数个数 form_basic_sigmoid = np.frompyfunc(basic_sigmoid,1,1) my_array = np.array(np.arange(6)) form_basic_sigmoid(my_array) #不报错 返回数组形式

numpy的函数都是泛型 参数既可以是一个数 也可以是数组

2.线性代数常用的操作

matrix(定义矩阵)#定义成线性代数的行列式类型 my_first_matrix = np.matrix([[3, 1, 4], [1, 5, 9], [2, 6, 5]]) transpose(转置) matrix inverse(矩阵逆) should return inverse (矩阵回逆 这个并不是矩阵的乘法 注意浮点值几乎等于零) create an identity matrix(创建标识矩阵 就是把上一步矩阵趋于0的变为0、趋于1的变为1) multiply(矩阵相乘) dot(矩阵点乘) Solve simultaneous linear equations(求解行列式方程)import numpy as np from numpy.linalg import solve #方程左边表达式 比如第一个:3x+y+4z=11 my_first_matrix = np.matrix([[3, 1, 4], [1, 5, 9], [2, 6, 5]]) right_hand_side = np.matrix([[11], [22], [33]]) #求解 solve(my_first_matrix, right_hand_side)

3.统计学常用操作

引入库和设置数据import scipy as sp import numpy as np number_of_data_points = 10000 random_data_set = sp.randn(number_of_data_points) 统计的属性 平均值 中值 最值 标准差与方差 所有属性一个描述
最新回复(0)