数据分析之numpy学习

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44205272/article/details/102414231

numpy的安装

pip3 install numpy

numpy的ndarray对象

  • NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
  • ndarray 对象是用于存放同类型元素的多维数组。
  • ndarray 中的每个元素在内存中都有相同存储大小的区域。

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
object 数组或嵌套的数列
dtype 数组元素的数据类型,可选
copy 对象是否需要复制,可选
order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
subok 默认返回一个与基类类型一致的数组
ndmin 指定生成数组的最小维度

import numpy as np 
a = np.array([1,2,3])  
print (a)

# 输出结果如下:
# [1, 2, 3]

# 多于一个维度  
import numpy as np 
a = np.array([[1,  2],  [3,  4]])  
print (a)
# 输出结果如下:
# [[1, 2] 
#  [3, 4]]

# 最小维度  
import numpy as np 
a = np.array([1, 2, 3, 4, 5], ndmin =  2)  
print (a)
# 输出如下:
# [[1, 2, 3, 4, 5]]

# dtype 参数  
import numpy as np 
a = np.array([1,  2,  3], dtype = complex)  
print (a)
# 输出结果如下:
# [ 1.+0.j,  2.+0.j,  3.+0.j]

ndarray 对象由计算机内存的连续一维部分组成,并结合索引模式,将每个元素映射到内存块中的一个位置。内存块以行顺序(C样式)或列顺序(FORTRAN或MatLab风格,即前述的F样式)来保存元素

numpy数组的属性

NumPy 数组的维数称为秩(rank),一维数组的秩为 1,二维数组的秩为 2,以此类推。在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。所以一维数组就是 NumPy 中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。很多时候可以声明 axis。axis=0,表示沿着第 0 轴进行操作,即对每一列进行操作;axis=1,表示沿着第1轴进行操作,即对每一行进行操作.

属性 说明
ndarray.ndim 秩,即轴的数量或维度的数量
ndarray.shape 数组的维度,对于矩阵,n行m列
ndarray.size 数组元素的总个数,相当于shape中 n*m 的值
ndarray.dtype ndarray 对象的元素类型
ndarray.itemsize ndarray 对象中每个元素的大小,以字节为单位
ndarray.flags ndarray 对象的内存信息
ndarray.real ndarray元素的实部
ndarray.imag ndarray 元素的虚部
import numpy as np  
a = np.arange(24)  
print (a.ndim)             # a 现只有一个维度
# 现在调整其大小
b = a.reshape(2,4,3)  # b 现在拥有三个维度
print (b.ndim)
# 输出结果为:
# 1
# 3

# ndarray.shape 表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 ndim 属性(秩)。比如,一个二维数组,其维度表示"行数"和"列数"。ndarray.shape 也可以用于调整数组大小。
a = np.array([[1,2,3],[4,5,6]])  
print (a.shape)
# 输出结果为:
# (2, 3)
a = np.array([[1,2,3],[4,5,6]]) 
a.shape = (3,2)  
print(a)
# 输出结果为:
# [[1 2]
#  [3 4]
# [5 6]]

# NumPy 也提供了 reshape 函数来调整数组大小
a = np.array([[1,2,3],[4,5,6]]) 
b = a.reshape(3,2)  
print (b)
# 输出结果为:
# [[1, 2] 
#  [3, 4] 
#  [5, 6]]

#ndarray.itemsize 以字节的形式返回数组中每一个元素的大小。
#例如,一个元素类型为 float64 的数组 itemsiz 属性值为 8(float64 占用 64 个 bits,每个字节长度为 8,所以 64/8,占用 8 个字节),又如,一个元素类型为 complex32 的数组 item 属性为 4(32/8)。

# 数组的 dtype 为 int8(一个字节)  
x = np.array([1,2,3,4,5], dtype = np.int8)  
print (x.itemsize)
 
# 数组的 dtype 现在为 float64(八个字节) 
y = np.array([1,2,3,4,5], dtype = np.float64)  
print (y.itemsize)
# 输出结果为:
# 1
# 8

numpy创建数组

numpy.empty方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组

import numpy as np 
x = np.empty([3,2], dtype = int) 
print (x)
'''
输出结果为:
[[ 6917529027641081856  5764616291768666155]
 [ 6917529027641081859 -5764598754299804209]
 [          4497473538      844429428932120]]
 '''
# 注意:数组元素为随机值,因为它们未初始化。

numpy.zeros创建指定大小的数组,数组元素以 0 来填充

mport numpy as np
# 默认为浮点数
x = np.zeros(5) 
print(x)
 
# 设置类型为整数
y = np.zeros((5,), dtype = np.int) 
print(y)
 '''
输出结果为:
[0. 0. 0. 0. 0.]
[0 0 0 0 0]
 '''

numpy.ones创建指定形状的数组,数组元素以 1 来填充

import numpy as np 
# 默认为浮点数
x = np.ones(5) 
print(x)
# 自定义类型
x = np.ones([2,2], dtype = int)
print(x)
'''
输出结果为:
[1. 1. 1. 1. 1.]
[[1 1]
 [1 1]]
 '''

numpy从已有的数组创建数组

numpy.asarray 类似 numpy.array,但 numpy.asarray 参数只有三个,比 numpy.array 少两个

将列表转换为 ndarray:

import numpy as np 
x =  [1,2,3] 
a = np.asarray(x)  
print (a)
# 输出结果为:
# [1  2  3]

将元组转换为 ndarray

import numpy as np 
x =  (1,2,3) 
a = np.asarray(x)  
print (a)
# 输出结果为:
# [1  2  3]

x =  [(1,2,3),(4,5)] 
a = np.asarray(x)  
print (a)
# 输出结果为:
# [(1, 2, 3) (4, 5)]

numpy从数值范围创建数组

numpy.arange

# 生成 0 到 5 的数组:
import numpy as np
x = np.arange(5)  
print (x)
# 输出结果如下:
# [0  1  2  3  4]

# 设置了 dtype
x = np.arange(5, dtype=float)  
print (x)
# 输出结果如下:
# [0.  1.  2.  3.  4.]


# 设置了起始值、终止值及步长:
x = np.arange(10,20,2)  
print (x)
# 输出结果如下:
# [10  12  14  16  18]

numpy.linspace 函数用于创建一个一维数组,数组是一个等差数列构成的

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

import numpy as np
a = np.linspace(1,10,10)
print(a)
# 输出结果为:
# [ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]

# 设置元素全部是1的等差数列:
a = np.linspace(1,1,10)
print(a)
# 输出结果为:
# [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

numpy.logspace 函数用于创建一个于等比数列

np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
start 序列的起始值为:base ** start
stop 序列的终止值为:base ** stop。如果endpoint为true,该值包含于数列中
num 要生成的等步长的样本数量,默认为50
endpoint 该值为 ture 时,数列中中包含stop值,反之不包含,默认是True。
base 对数 log 的底数。
dtype ndarray 的数据类型

import numpy as np
# 默认底数是 10
a = np.logspace(1.0,  2.0, num =  10)  
print (a)
'''
输出结果为:
[ 10.           12.91549665     16.68100537      21.5443469  27.82559402      
  35.93813664   46.41588834     59.94842503      77.42636827    100.    ]
'''
# 将对数的底数设置为2
a = np.logspace(0,9,10,base=2)
print (a)
# 输出如下:
# [  1.   2.   4.   8.  16.  32.  64. 128. 256. 512.]

numpy的切片和索引

ndarray对象的内容可以通过索引或切片来访问和修改,与Python的list切片是一样的

普通索引
import numpy as np
a = np.arange(10)
s = slice(2,7,2)   # 从索引2开始到索引7停止,间隔为2
print (a[s])
# 输出结果为:
# [2  4  6]

# 我们也可以通过冒号分隔切片参数 start:stop:step 来进行切片操作

a = np.arange(10)  
b = a[2:7:2]   # 从索引2开始到索引7停止,间隔为2
print(b)
# 输出结果为:
# [2  4  6]

a = np.arange(10)  # [0 1 2 3 4 5 6 7 8 9]
b = a[5] 
print(b)
# 输出结果为:
# 5

a = np.arange(10)
print(a[2:])
# 输出结果为:
# [2  3  4  5  6  7  8  9]

a = np.arange(10)  # [0 1 2 3 4 5 6 7 8 9]
print(a[2:5])
# 输出结果为:
# [2  3  4]

a = np.array([[1,2,3],[3,4,5],[4,5,6]])
# 从某个索引处开始切割
print(a[1:])

# [[3 4 5]
#  [4 5 6]]

# 切片还可以包括省略号 …,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray

a = np.array([[1,2,3],[3,4,5],[4,5,6]])  
print (a[...,1])   # 第2列元素
print (a[1,...])   # 第2行元素
print (a[...,1:])  # 第2列及剩下的所有元素
'''
输出结果为:
[2 4 5]
[3 4 5]
[[2 3]
 [4 5]
 [5 6]]
 '''
整数数组索引
import numpy as np
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b = a[1:3, 1:3]
c = a[1:3,[1,2]]
d = a[...,1:]
print(b)
print(c)
print(d)
'''
输出结果为:
[[5 6]
 [8 9]]
[[5 6]
 [8 9]]
[[2 3]
 [5 6]
 [8 9]]
 '''
布尔索引

我们可以通过一个布尔数组来索引目标数组。布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组

# 以下实例获取大于 5 的元素
import numpy as np 
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print (x)
print (x[x >  5])
'''
输出结果为:
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
 
[ 6  7  8  9 10 11]
'''

# 以下实例使用了 ~(取补运算符)来过滤 NaN。

a = np.array([np.nan,  1,2,np.nan,3,4,5])  
print (a[~np.isnan(a)])

# [ 1.   2.   3.   4.   5.]

# 以下实例演示如何从数组中过滤掉非复数元素。

a = np.array([1,  2+6j,  5,  3.5+5j])  
print (a[np.iscomplex(a)])
# 输出如下:
# [2.0+6.j  3.5+5.j]
花式索引

花式索引指的是利用整数数组进行索引。花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行。花式索引跟切片不一样,它总是将数据复制到新数组中。

# 传入顺序索引数组

import numpy as np 
x=np.arange(32).reshape((8,4))
print (x[[4,2,1,7]])
'''
输出结果为:
[[16 17 18 19]
 [ 8  9 10 11]
 [ 4  5  6  7]
 [28 29 30 31]]
 '''
# 传入倒序索引数组
x=np.arange(32).reshape((8,4))
print (x[[-4,-2,-1,-7]])
'''
输出结果为:
[[16 17 18 19]
 [24 25 26 27]
 [28 29 30 31]
 [ 4  5  6  7]]
 '''
# 传入多个索引数组(要使用np.ix_)
x=np.arange(32).reshape((8,4))
print (x[np.ix_([1,5,7,2],[0,3,1,2])])  # 第一个数组表示行,第二个数组表示列
'''
输出结果为:
[[ 4  7  5  6]
 [20 23 21 22]
 [28 31 29 30]
 [ 8 11  9 10]]
 '''

numpy的线性代数

numpy.dot() 对于两个一维的数组,计算的是这两个数组对应下标元素的乘积和(数学上称之为内积);对于二维数组,计算的是两个数组的矩阵乘积;对于多维数组,它的通用计算公式如下,即结果数组中的每个元素都是:数组a的最后一维上的所有元素与数组b的倒数第二位上的所有元素的乘积和: dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])

import numpy.matlib
import numpy as np 
a = np.array([[1,2],[3,4]])
b = np.array([[11,12],[13,14]])
print(np.dot(a,b))
'''
输出结果为:
[[37  40] 
 [85  92]]
计算式为:
[[1*11+2*13, 1*12+2*14],[3*11+4*13, 3*12+4*14]]
'''

numpy.vdot() 函数是两个向量的点积。 如果第一个参数是复数,那么它的共轭复数会用于计算。 如果参数是多维数组,它会被展开.

import numpy as np 
a = np.array([[1,2],[3,4]]) 
b = np.array([[11,12],[13,14]]) 
# vdot 将数组展开计算内积
print (np.vdot(a,b))
'''
输出结果为:
130
计算式为:
1*11 + 2*12 + 3*13 + 4*14 = 130
'''

numpy.inner() 函数返回一维数组的向量内积。对于更高的维度,它返回最后一个轴上的和的乘积

import numpy as np 
a = np.array([[1,2], [3,4]]) 
b = np.array([[11, 12], [13, 14]]) 
print (np.inner(a,b))
'''
输出结果为:
[[35 41]
 [81 95]]
内积计算式为:
1*11+2*12, 1*13+2*14 
3*11+4*12, 3*13+4*14
'''

numpy.linalg.det() 函数计算输入矩阵的行列式

import numpy as np
a = np.array([[1,2], [3,4]]) 
print (np.linalg.det(a))

# -2.0

numpy.linalg.solve() 函数给出了矩阵形式的线性方程的解
在这里插入图片描述

numpy.linalg.inv() 函数计算矩阵的乘法逆矩阵

import numpy as np 
a = np.array([[1,1,1],[0,2,5],[2,5,-1]])  
print ('数组 a:')
print (a)
ainv = np.linalg.inv(a) 
 
print ('a 的逆:')
print (ainv)
 
print ('矩阵 b:')
b = np.array([[6],[-4],[27]]) 
print (b)
 
print ('计算:A^(-1)B:')
x = np.linalg.solve(a,b) 
print (x)
# 这就是线性方向 x = 5, y = 3, z = -2 的解
'''
输出结果为:
数组 a:
[[ 1  1  1]
 [ 0  2  5]
 [ 2  5 -1]]
a 的逆:
[[ 1.28571429 -0.28571429 -0.14285714]
 [-0.47619048  0.14285714  0.23809524]
 [ 0.19047619  0.14285714 -0.0952381 ]]
矩阵 b:
[[ 6]
 [-4]
 [27]]
计算:A^(-1)B:
[[ 5.]
 [ 3.]
 [-2.]]
 '''

猜你喜欢

转载自blog.csdn.net/qq_44205272/article/details/102414231