python数据分析-NumPy学习(中)

简介: python数据分析-NumPy学习

ndarray.dtype

描述数组中元素类型的对象。可以使用标准Python类型创建或指定dtype。另外,NumPy提供了自己的类型。numpy.int32,numpy.int16和numpy.float64是一些示例。

import numpy as np
ary = np.array([1, 2, 3, 4, 5, 6])
print(type(ary), ary, ary.dtype)
#转换ary元素的类型
b = ary.astype(float)
print(type(b), b, b.dtype)
#转换ary元素的类型
c = ary.astype(str)
print(type(c), c, c.dtype)


ndarray.itemsize

数组中每个元素的大小(以字节为单位)。例如,类型为元素的数组float64具有itemsize8(= 64/8),而类型complex32中的一个具有itemsize4(= 32/8)。等同于ndarray.dtype.itemsize。

import numpy as np
a = np.arange(15).reshape(3, 5)
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
a.itemsize


d.自定义复合类型


# 自定义复合类型
import numpy as np
data=[
  ('zs', [90, 80, 85], 15),
  ('ls', [92, 81, 83], 16),
  ('ww', [95, 85, 95], 15)
]
#第一种设置dtype的方式
a = np.array(data, dtype='U3, 3int32, int32')
print(a)
print(a[0]['f0'], ":", a[0]['f1'])
print("=====================================")
#第二种设置dtype的方式
b = np.array(data, dtype=[('name', 'str_', 2),
                    ('scores', 'int32', 3),
                    ('age', 'int32', 1)])
print(b[0]['name'], ":", b[0]['scores'])
print("=====================================")
#第三种设置dtype的方式
c = np.array(data, dtype={'names': ['name', 'scores', 'ages'],
                    'formats': ['U3', '3int32', 'int32']})
print(c[0]['name'], ":", c[0]['scores'], ":", c.itemsize)
zs : [90 80 85] : 15 28  # 元素字节数
print("=====================================")
#第四种设置dtype的方式  
d = np.array(data, dtype={'name': ('U3', 0),
                    'scores': ('3int32', 16),
                    'age': ('int32', 28)})
print(d[0]['names'], d[0]['scores'], d.itemsize)
print("=====================================")
#测试日期类型数组
f = np.array(['2011', '2012-01-01', '2013-01-01 01:01:01','2011-02-01'])
['2011' '2012-01-01' '2013-01-01 01:01:01' '2011-01-01']
f = f.astype('M8[D]')
['2011-01-01' '2012-01-01' '2013-01-01' '2011-01-01']
f = f.astype('i4')
[14975 15340 15706 14975]
print(f[3]-f[0])
0
f.astype('bool')
array([ True,  True,  True,  True])


6.数组索引和切片


a.索引操作


一般索引:

import numpy as np
array01=np.arange(1,10)
array01[5]#索引
list02=[[1,2,3,4,5],[7,8,9,10,11],[12,34,6,6,8]]
array03=np.array(list02)
array03[0,3]#索引


高级索引:NumPy 比一般的 Python 序列提供更多的索引方式。除了之前看到的用整数和切片的索引外,数组可以由整数数组索引、布尔索引及花式索引。

高级索引-菜鸟笔记


1670741973992.jpg

1670741981930.jpg

1670741988802.jpg

1670741999562.jpg

1670742006171.jpg

1670742012924.jpg


b.一维数组切片操作


数组对象切片的参数设置与列表切片参数类似


步长+:默认切从首到尾


步长-:默认切从尾到首


数组对象[起始位置:终止位置:步长, …]


默认位置步长:1


import numpy as np
a = np.arange(1, 10)
print(a)  
print(a[:3])  
print(a[3:6])   
print(a[6:]) 
print(a[::-1])  
print(a[:-4:-1])  
print(a[-4:-7:-1])  
print(a[-7::-1])  
print(a[::])  
print(a[:])  
print(a[::3])  
print(a[1::3])  
print(a[2::3])


c.多维数组的切片操作


数组对象[页号, 行号, 列号],下标从0开始,到数组len-1结束。

import numpy as np
a = np.arange(1, 28).reshape(3,3,3)
print(a)
#切出1页 
print(a[1, :, :])  
#切出所有页的1行
print(a[:, 1, :])  
#切出0页的1行1列
print(a[0, :, 1])


练习:

import numpy as np
a = np.arange(10)
print(a[2:7:2])
print(a[2],a)
print(a[2:])
t1 = np.arange(24).reshape(4,6)
print(t1) 
print('*'*20) 
print(t1[1]) 
print(t1[1,:])  
print(t1[1:]) 
print(t1[1:3,:]) 
print(t1[[0,2,3]]) 
print(t1[[0,2,3],:]) 
print(t1[:,1])
print(t1[:,1:]) 
print(t1[:,[0,2,3]]) 
print(t1[2,3])
print(t1[[0,1,1],[0,1,3]])


7.数组的操作


注意: 要结合学习。 我对numpy的笔记大部分只是仅限于框架引领作用,不可能做到面面俱到,所以语法细节大部分要去对比菜鸟笔记以及numpy官网(百度numpy即可,注意使用谷歌浏览器可以即时翻译)结合学习。


a.形状操作


numpy.shape()、numpy.resize()、numpy.flatten()、numpy.reshape()、numpy.ravel()

1670742074055.jpg

1670742087952.jpg

**ndarray的形状:**
four = np.array([[1,2,3],[4,5,6]])
# shape修改的是原有的
four.shape = (3,2) 
four
# reshape返回一个新的数组 
four = four.reshape(3,2) 
four
# 将多维变成一维数组 
five = four.reshape((6,),order='F') 
# 默认情况下参数order=‘C’以行为主的顺序展开,‘F’(Fortran风格)意味着以列的顺序展开 
six = four.flatten(order='F') 
five 
six 
# 拓展:数组的形状 
t = np.arange(24) 
t
t.shape
# 转换成二维 
t1 = t.reshape((4,6)) 
t1 
t1.shape
# 转成三维 
t2 = t.reshape((2,3,4)) 
t2
t2.shape
**视图变维(数据共享):** reshape() 与 ravel() 
import numpy as np
a = np.arange(1, 9)
print(a)  # [1 2 3 4 5 6 7 8]
b = a.reshape(2, 4) #视图变维  : 变为2行4列的二维数组
print(b)
[[1 2 3 4]
 [5 6 7 8]]
c = b.reshape(2, 2, 2) #视图变维    变为2页2行2列的三维数组
print(c)
[[[1 2]
  [3 4]]
 [[5 6]
  [7 8]]]
d = c.ravel() #视图变维 变为1维数组
print(d)
[1 2 3 4 5 6 7 8]
**复制变维(数据独立):**flatten()
e = c.flatten()
print(e)
[1 2 3 4 5 6 7 8]
a += 10
print(a, e, sep='\n')
[11 12 13 14 15 16 17 18]
[1 2 3 4 5 6 7 8]
# 比较
ndarray.shape, reshape, resize, ravel
**就地变维:直接改变原数组对象的维度,不返回新数组**
a.shape = (2, 4)
print(a)
[[11 12 13 14]
 [15 16 17 18]]
a.resize(2, 2, 2)
print(a)
[[[11 12]
  [13 14]]
 [[15 16]
  [17 18]]]


以下代码是看视频写在jupyter notebook上的代码。

import numpy as np
array01=np.arange(32)
array01
array01.shape
array01.ndim
#就地变维:直接改变原数组对象的维度,不返回新数组
array01.shape=(1,32)
array01
array01.shape=(2,16)
array01
array01.shape=(4,8)
array01
array01.shape=(32,1)
array01
array01.shape=(2,4,4)
array01
#就地变维:等同于上面。
array01.resize(2,4,4)
array01
#复制变维:两个内存地址,数据独立
array02=array01.flatten()
array02
print(id(array01))
print(id(array02))
#视图变维(表面上看是一个4行8列的,但是本质上来说,
#他并没改变,只是视图上的变维,本质是没有任何改变)
array02.reshape(4,8)
array02
array03=array02.reshape(4,8)
array03
print(id(array03))
print(id(array02))
#raval()
array03=array02.reshape(4,8)
array03
array03.shape
array03.ndim
np.ravel(array03,order="C")
np.ravel(array03,order="F")
array03


b.数组数值的修改和添加元素


numpy.reshape()

1670742143872.jpg


numpy.append()

1670742154253.jpg


#1. numpy.append

numpy.append(arr, values, axis=None)

函数在数组的末尾添加值。追加操作会分配整个数组,并把原来的数组复制到新数组中。此外,输入# 数组的维度必须匹配否则将生成ValueError。


‘’’

参数说明:

arr:输入数组

values:要向arr添加的值,需要和arr形状相同(除了要添加的轴)

axis:默认为 None。

当axis无定义时,是横向加成,返回总是为一维数组!

当axis有定义的时候,分别为0和1的时候(列数要相同)。

当axis为1时,数组是加在右边 (行数要相同)。

‘’’

a = np.array([[1,2,3],[4,5,6]])
a
#向数组添加元素:
np.append(a, [7,8,9]) 
#沿轴 0 添加元素
np.append(a, [[7,8,9]],axis = 0) 
#、 沿轴 1 添加元素:
np.append(a, [[5,5,5],[7,8,9]],axis = 1)


numpy.insert()

1670742481864.jpg

numpy.insert(arr, obj, values, axis)
# 函数在给定索引之前,沿给定轴在输入数组中插入值。 
# 如果值的类型转换为要插入,则它与输入数组不同。插入没有原地的,函数会返回一个新数组。此外,如果未提供轴,则输入数组会被展开。
a = np.array([[1,2],[3,4],[5,6]])
a
# 未传递 Axis 参数。 在插入之前输入数组会被展开 
np.insert(a,3,[11,12])
# 传递了 Axis 参数。 会广播值数组来配输入数组
# 沿轴0
np.insert(a,1,[11],axis = 0)
# 沿轴1
np.insert(a,1,11,axis = 1)


这段代码是参考上述视频编写的学习代码

import numpy as np
t=np.arange(24).reshape(4,6)
t
#整数的索引和切片
t[1,2]=800
t
t[0:2,0:2]
#整数数组索引
t[[0,1,2],[0,1,3]]=500
t
#布尔索引
t[t>15]=1500
t
#花式索引
t[t>15]=1500
t
#数组数值的修改
t[1,:]=0
t
t[:,1]=0
t
t[1:3,:]=0
t
t[:,1:4]=0
t
t[1:4,2:5]=0
t
t[[0,1],[0,3]]=0
t
#数组添加元素;append()添加
array02=np.arange(24).reshape(4,6)
array02
array03=np.append(array02,25)
array03
print(id(array02))
print(id(array03))
array04=np.arange(6)
array03=np.append(array02,array04)#没有axis就直接拉平
array03
array04=np.arange(6)
array04
array04=np.arange(6).reshape(1,6)
array04
array03=np.append(array02,array04,axis=0)#以行为标准
array03
array04=np.arange(4).reshape(4,1)
array04
array03=np.append(array02,array04,axis=1)#以列为标准
array03
#insert添加
array02
array04=np.arange(4)
array04
array05=np.insert(array02,2,array04,axis=1)
array05
array02


c.删除数组元素


numpy.delete()


1670742546860.jpg

# numpy.delete 
numpy.delete(arr, obj, axis)
# 函数返回从输入数组中删除指定子数组的新数组。 与insert()函数的情况一样,如果未提供轴参数,则输入数组将展开。
''' 
参数说明: 
arr:输入数组 
obj:要沿指定轴删除的子数组的索引,接收切片,整数或整数数组
axis:沿着它删除给定子数组的轴,如果未提供,则输入数组会被展开 
'''
a = np.arange(12).reshape(3,4)
a
# 未传递 Axis 参数。 在删除之前输入数组会被展开 
np.delete(a,5)
# 删除每一行中的第二列 
np.delete(a,1,axis = 1)


numpy.unique()


1670743335258.jpg

# numpy.unique 函数用于去除数组中的重复元素。
numpy.unique(arr, return_index, return_inverse, return_counts)
''' 
参数说明:
arr:输入数组,如果不是一维数组则会展开 
return_index:如果为true,返回新列表元素在旧列表中的位置(下标),并以列表形式储 
return_inverse:如果为true,返回旧列表元素在新列表中的位置(下标),并以列表形式储 
return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数 
'''
a = np.array([5,2,6,2,7,5,6,8,2,9])
a
# 第一个数组的去重值
u = np.unique(a) 
u
# 去重数组的索引数组
u,indices = np.unique(a, return_index = True) 
indices
# 去重数组的下标
u,indices = np.unique(a,return_inverse = True) 
u
indices
# 返回去重元素的重复数量 
u,indices = np.unique(a,return_counts = True) 
u
indices


numpy.clip()

1670743354834.jpg

t.clip(10,18)
# 小于10的替换成10,大于18的替换成18
#这是jupyter notebook的笔记
import numpy as np
t=np.arange(24).reshape(4,6)
t
#元素删除:numpy.delete()
array02
np.delete(array02,2)
np.delete(array02,[2,4,6,8])
np.delete(array02,2,axis=0)
#数组元素去重numpy.unique()
array03=np.array([[0,11,22,3,4,5],
                [11,12,13,14,15,11],
                [11,12,13,14,15,11],
                [18,16,20,21,15,23]])
array03
#np.unique(array03,axis=0)#意思是两行元素完全相同的时候才算做重复
np.unique(array03,return_inverse=True,axis=0)#意思是两行元素完全相同的时候才算做重复
array03#说明什么视图与本质还是有区别的
np.unique(array03,return_index=True,axis=0)#意思是两行元素完全相同的时候才算做重
np.unique(array03,return_counts=True,axis=0)#意思是两行元素完全相同的时候才算做重复
#数组的裁减numpy.clip()
array03
np.clip(array03,12,20)#小于12的都变成了12 ,大于20的都变成了20
array03
np.clip(array03,12,20,out=array03)#小于12的都变成了12 ,大于20的都变成了20
array03#说明啥子,使用out以后原数组也变了,就地裁剪。


d.数组的行列转换、迭代,转置

1670743389093.jpg

t[[1, 2], :] = t[[2, 1], :] # 行列交换
t[: ,[0, 2]] = t[: ,[2, 0]] # 列交换
import numpy as np
array01=np.arange(24).reshape(4,6)
array01
array01[[0,1],:]=array01[[1,0],:]#行交换
array01
array01[:,[2,3]]=array01[:,[3,2]]#列的交换
array01#原理:x,y=y,x

1670743416605.jpg

#迭代数组
array01.shape
array01.ndim
#;利用flat扁平化一位数组,然后遍历、迭代
for item in array01.flat:#二维数组的迭代
    print(item)
for i in range(array01.size):
    print(array01.flat[i])
for item in np.nditer(array01):#相当于array01.flat
    print(item)
#for...for 循环
for item in array01:
    print(item)
for items in array01:#嵌套循环
    for item in items:
        print(item)


转置:np.transpose()、array.T、rollaxis()、swapaxes()

1670743438900.jpg

# 数组的转置
array01
array01.T#行列的变换
np.transpose(array01,axes=(1,0))
np.transpose(array01,axes=(0,1))


e.连接和分割数组


连接:numpy.concatenate()、numpy.column_stack()、numpy.row_stack()

1670743457762.jpg


连接:numpy.stack()、numpy.hstack()、numpy.vstack、numpy.dstack()、numpy.pad()

1670743466649.jpg

垂直方向操作:vstack()

import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
a,b
# 垂直方向完成组合操作,生成新数组
c = np.vstack((a, b))
# 垂直方向完成拆分操作,生成两个数组
d, e = np.vsplit(c, 2)


水平方向操作:hstack()

import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
a,b
# 水平方向完成组合操作,生成新数组 
c = np.hstack((a, b))
# 水平方向完成拆分操作,生成两个数组
d, e = np.hsplit(c, 2)


深度方向操作:dstack()(3维)

import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
a,b
# 深度方向(3维)完成组合操作,生成新数组
i = np.dstack((a, b))
# 深度方向(3维)完成拆分操作,生成两个数组
k, l = np.dsplit(i, 2)


长度不等的数组组合:

import numpy as np
a = np.array([1,2,3,4,5])
b = np.array([1,2,3,4])
a,b
# 填充b数组使其长度与a相同
b = np.pad(b, pad_width=(0, 1), mode='constant', constant_values=-1)
b
# 垂直方向完成组合操作,生成新数组
c = np.vstack((a, b))
c


多维数组组合与拆分的相关函数:


# 通过axis作为关键字参数指定组合的方向,取值如下:

# 若待组合的数组都是二维数组:

# 0: 垂直方向组合

# 1: 水平方向组合

# 若待组合的数组都是三维数组:

# 0: 垂直方向组合

# 1: 水平方向组合

# 2: 深度方向组合

np.concatenate((a, b), axis=0)
# 通过给出的数组与要拆分的份数,按照某个方向进行拆分,axis的取值同上
np.split(c, 2, axis=0)


简单的一维数组组合方案

a = np.arange(1,9)  
b = np.arange(9,17) 
#把两个数组摞在一起成两行
c = np.row_stack((a, b))
c
#把两个数组组合在一起成两列
d = np.column_stack((a, b))
d


分割:numpy.split()、numpy.hsplit()、numpy.vsplit()、numpy.dsplit()

1670743578049.jpg

将一个数组拆分为几个较小的数组

hsplit # 沿数组的水平轴拆分数组
vsplit # 沿数组的垂直轴拆分数组
array_split # 指定沿哪个轴分割


上述jupyter的代码笔记如下

#连接数组num
import numpy as np
array01=np.arange(24).reshape(4,6)
array01
array02 = np.arange(24).reshape(4,6)
array02
np.concatenate((array01,array02),axis=0) #按照列的个数匹配链接
np.concatenate((array01,array02),axis=1) #按照列的个数匹配链接
#numpy.column_stack(*args,**kwargs)
np.column_stack((array01,array02))
np.row_stack((array01,array02))
#np.dstack(a1,a2)
np.dstack((array01,array02))
#分割数组:
#水平切
np.hsplit(array01,2)
array01
array04,array05,array06=np.hsplit(array01,3)
array04
array05
array06
#垂直切(与上面同理)
np.vsplit(array02,2)
#沿深度切
#np.dstack(a1,a2)
array03=np.dstack((array01,array02))
array03
array04,array05=np.vsplit(array03,2)
array04
array05
相关文章
|
13天前
|
数据采集 存储 数据挖掘
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第27天】在数据分析领域,Python的Pandas库因其强大的数据处理能力而备受青睐。本文介绍了Pandas在数据导入、清洗、转换、聚合、时间序列分析和数据合并等方面的高效技巧,帮助数据分析师快速处理复杂数据集,提高工作效率。
40 0
|
8天前
|
机器学习/深度学习 数据采集 数据挖掘
解锁 Python 数据分析新境界:Pandas 与 NumPy 高级技巧深度剖析
Pandas 和 NumPy 是 Python 中不可或缺的数据处理和分析工具。本文通过实际案例深入剖析了 Pandas 的数据清洗、NumPy 的数组运算、结合两者进行数据分析和特征工程,以及 Pandas 的时间序列处理功能。这些高级技巧能够帮助我们更高效、准确地处理和分析数据,为决策提供支持。
19 2
|
13天前
|
存储 数据处理 Python
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第27天】在科学计算和数据分析领域,Python凭借简洁的语法和强大的库支持广受欢迎。NumPy和SciPy作为Python科学计算的两大基石,提供了高效的数据处理和分析工具。NumPy的核心功能是N维数组对象(ndarray),支持高效的大型数据集操作;SciPy则在此基础上提供了线性代数、信号处理、优化和统计分析等多种科学计算工具。结合使用NumPy和SciPy,可以显著提升数据处理和分析的效率,使Python成为科学计算和数据分析的首选语言。
22 3
|
14天前
|
存储 数据挖掘 数据处理
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第26天】Python 是数据分析领域的热门语言,Pandas 库以其高效的数据处理功能成为数据科学家的利器。本文介绍 Pandas 在数据读取、筛选、分组、转换和合并等方面的高效技巧,并通过示例代码展示其实际应用。
29 2
|
14天前
|
存储 机器学习/深度学习 算法
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第26天】NumPy和SciPy是Python科学计算领域的两大核心库。NumPy提供高效的多维数组对象和丰富的数学函数,而SciPy则在此基础上提供了更多高级的科学计算功能,如数值积分、优化和统计等。两者结合使Python在科学计算中具有极高的效率和广泛的应用。
31 2
|
5天前
|
并行计算 数据挖掘 大数据
Python数据分析实战:利用Pandas处理大数据集
Python数据分析实战:利用Pandas处理大数据集
|
5天前
|
数据采集 数据可视化 数据挖掘
利用Python进行数据分析:Pandas库实战指南
利用Python进行数据分析:Pandas库实战指南
|
7天前
|
SQL 数据挖掘 Python
数据分析编程:SQL,Python or SPL?
数据分析编程用什么,SQL、python or SPL?话不多说,直接上代码,对比明显,明眼人一看就明了:本案例涵盖五个数据分析任务:1) 计算用户会话次数;2) 球员连续得分分析;3) 连续三天活跃用户数统计;4) 新用户次日留存率计算;5) 股价涨跌幅分析。每个任务基于相应数据表进行处理和计算。
|
8天前
|
数据采集 数据可视化 数据挖掘
使用Python进行数据分析和可视化
【10月更文挑战第33天】本文将介绍如何使用Python编程语言进行数据分析和可视化。我们将从数据清洗开始,然后进行数据探索性分析,最后使用matplotlib和seaborn库进行数据可视化。通过阅读本文,你将学会如何运用Python进行数据处理和可视化展示。
|
3月前
|
数据采集 数据可视化 数据挖掘
数据分析大神养成记:Python+Pandas+Matplotlib助你飞跃!
在数字化时代,数据分析至关重要,而Python凭借其强大的数据处理能力和丰富的库支持,已成为该领域的首选工具。Python作为基石,提供简洁语法和全面功能,适用于从数据预处理到高级分析的各种任务。Pandas库则像是神兵利器,其DataFrame结构让表格型数据的处理变得简单高效,支持数据的增删改查及复杂变换。配合Matplotlib这一数据可视化的魔法棒,能以直观图表展现数据分析结果。掌握这三大神器,你也能成为数据分析领域的高手!
77 2