Python学习之数组(numpy)

随机数

import random

random.seed(3)  # 设置随机数的种子数
print(random.randint(1, 100))  # 生成1~100之间的整数
print(random.uniform(-10, 10))  # 生成-10~10之间的浮点数(实数)
print(round(random.uniform(-10, 10), 2))  # 保留小数点后2位有效数字

numpy下载

pip install numpy -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
import numpy as np

#rand为通过numpy.random.RandomState()定义的一个随机变量的生成器
rand = np.random.RandomState(32)  # 32为随机种子数
x = rand.randint(0, 10, (3, 6))  # 生成0~10之间,3行6列的矩阵
print(x)

-----------------------------------------

rand = np.random.RandomState(1)  # 32为随机种子数
x = rand.rand(5) * 10
print(x)
#[4.17022005e+00 7.20324493e+00 1.14374817e-03 3.02332573e+00 #1.46755891e+00]
x = rand.rand(2, 5)
print(x)
#[[0.09233859 0.18626021 0.34556073 0.39676747 0.53881673]
#[0.41919451 0.6852195  0.20445225 0.87811744 0.02738759]]
x = rand.randn(5) + 5
print(x)
#[4.14009339 6.77260763 3.88963695 5.18121427 5.56434487]
  • numpy.random.rand(d0,d1,…,dn)

1.rand函数根据给定维度生成[0,1)之间均匀分布的数据,包含0,不包含1

2.dn表格每个维度

3.返回值为指定维度的array

  • numpy.random.randn(d0,d1,…,dn)

1.randn函数返回一个或一组样本,具有标准正态分布。

2.dn表格每个维度

3.返回值为指定维度的array

生成等距数列

import numpy as np

x = np.linspace(0, 10, 20)  # 范围为0~10,含有20个元素
print(x)
#[ 0.          0.52631579  1.05263158  1.57894737  2.10526316  2.63157895
#  3.15789474  3.68421053  4.21052632  4.73684211  5.26315789  5.78947368
#  6.31578947  6.84210526  7.36842105  7.89473684  8.42105263  8.94736842
 # 9.47368421 10.        ]

数组

import numpy as np

a1 = np.arange(1, 20)  # (start,end,step)
print(a1)
#[ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
a2 = np.array([1, 3, 5])
print(a2)
#[1 3 5]
a3 = np.zeros((2, 2))  # 全0数组,()表示的是目标数组的形状
print(a3)
#[[0. 0.]
# [0. 0.]]
a4 = np.ones((2, 2))  # 全1数组
print(a4)
#[[1. 1.]
# [1. 1.]]
a5 = np.full((2, 2), 2)  # full((),x) ()表示的是目标数组的形状,x表示的是数组的值
print(a5)
#[[2 2]
# [2 2]]
rand = np.random.RandomState(1)
a6 = rand.randint(0, 100, [3, 5])  # 0,100表示的是数据范围,[3,5]是数组的形状
print(a6)
#[[37 12 72  9 75]
# [ 5 79 64 16  1]
# [76 71  6 25 50]]

特征:

  • shape代表数组的形状
  • dtype代表数组的数据类型
 import numpy as np

myArray1 = np.zeros(shape=(2,15),dtype=float)#shape可省略,可以是元组或列表
print(myArray1)
#[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
# [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
myArray2 = np.zeros((2, 3), dtype=float)
print(myArray2)
#[[0. 0. 0.]
# [0. 0. 0.]]
myArray3 = np.ones([2, 3], dtype=int)
print(myArray3)
#[[1 1 1]
# [1 1 1]]

切片的操作和列表类似

import numpy as np

myArray1 = np.arange(1, 20)
print(myArray1)  # [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
print(myArray1[[1, 3, 5]])  # [2 4 6] 表示的是下标,有两层[] 不规律切片
print(myArray1[myArray1 < 5])  # [1 2 3 4]
print(myArray1[::-1])  # [19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1]

np.newaxis为指定一个新维度,shape()查看形状

import numpy as np

a = np.arange(1, 5)
print(a.shape) # (4,)
a = a[:, np.newaxis]
print(a)
#[[1]
# [2]
# [3]
# [4]]
print(a.shape)#(4, 1)
print(a[:, np.newaxis])
#[[[1]]

# [[2]]

# [[3]]

# [[4]]]
print(a[:, np.newaxis].shape)  # (4, 1, 1)
print(a[np.newaxis, :])
#[[[1]
#  [2]
#  [3]
#  [4]]]
print(a[np.newaxis, :].shape)  # (1, 4, 1)

更改形状与多维切片

import numpy as np

myArray = np.arange(1, 21).reshape([5, 4])
print(myArray)
#[[ 1  2  3  4]
# [ 5  6  7  8]
# [ 9 10 11 12]
# [13 14 15 16]
# [17 18 19 20]]

print(myArray[[0, 2], 1])  # [ 2 10]

浅拷贝与深拷贝

浅拷贝:相当于共享地址,两者不相互独立

import numpy as np

a = np.arange(0,5)
b = a
b[1] = 10
print(a)
#[ 0 10  2  3  4]

深拷贝:两个空间,两者相互独立

import numpy as np

a = np.arange(0,5)
b = a.copy()
b[1] = 10
print(a)
#[0 1 2 3 4]
  • reshape 直接修改了数组本身,resize返回一个新的数组
  • 矩阵的转置: swapaxes()和transpose() 交换维度
  • 多维数组转为一位数组 :flatten()
  • 多维数组转化为嵌套列表: tolist()
  • 重设数组元素数据类型: astype()
  • 数组的三个常用属性,shape,ndim,size
  • 查看数据类型type()

ndarray的计算:

  • 乘法,相当于矩阵的乘法,对每个元素都乘对应的数
  • 横向拆分 np.split()
  • 纵向拆分 np.vsplit()
import numpy as np

myArray = np.arange(1, 21).reshape([5, 4])
print(myArray)
# 求矩阵的秩
print(myArray.ndim)  # 2
# 横向拆分
print(np.split(myArray.flatten(), [3, 6]))
# [array([1, 2, 3]), array([4, 5, 6]), array([ 7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])]
# 纵向拆分
print(np.vsplit(myArray, [1, 2]))
'''
[array([[1, 2, 3, 4]]), array([[5, 6, 7, 8]]), array([[ 9, 10, 11, 12],
       [13, 14, 15, 16],
       [17, 18, 19, 20]])]

合并
axis=x 表示的是第x维
axis=0 表示列
axis=1 表示行

import numpy as np

myArray = np.array([[3, 4, 5], [6, 7, 8]])
myArray1 = np.array([[1, 2, 3], [2, 3, 4]])
print(myArray.shape)  # (2, 3)
print(myArray1.shape)  # (2, 3)
myArray2 = np.concatenate((myArray, myArray1), axis=0)
print(myArray2)
'''
[[3 4 5]
 [6 7 8]
 [1 2 3]
 [2 3 4]]
 '''
print(myArray2.shape)  # (4, 3)
myArray2 = np.concatenate((myArray, myArray1), axis=1)
print(myArray2)
'''
[[3 4 5 1 2 3]
 [6 7 8 2 3 4]]
 '''
print(myArray2.shape)  # (2, 6)

横向合并 vstack :列的个数相同,相当于np.concatenate((), axis=0)
纵向合并 hstack :行的个数相同,相当于np.concatenate((), axis=1)

numpy中的函数计算

import numpy as np

print(np.sum([0.5, 1.5]))
# 2.0
print(np.sum([0.5, 0.7, 0.2, 1.5], dtype=np.int32))
# 1 #这里是1因为先把所以的数据线转成int32类型再相加
print(np.sum([[0, 1], [0, 5]]))
# 6 #什么都不写就是全加起来
print(np.sum([[0, 1], [0, 5]], axis=0))
# array([0, 6]) #axis = 0代表列相加
print(np.sum([[0, 1], [0, 5]], axis=1))
# array([1, 5]) #axis = 1代表行相加

ndarray支持用户自定义元素的类型,通过设置dtype的参数

a1 = np.array([1, 2, 3, None])
print(a1)  # [1 2 3 None]
a1 = np.array([1, 2, 3, None, np.nan])
print(a1)  # [1 2 3 None nan]
print(a1.dtype)  # object

插入与删除

import numpy as np

myArray1 = np.array([11, 12, 13, 14, 15, 16, 17])
a = np.delete(myArray1, 2)#2值的是下标
print(a)  # [11 12 14 15 16 17]
print(myArray1)  # [11 12 13 14 15 16 17]
a = np.insert(myArray1,2,97)#2为下标,97为值
print(a)  # [11 12 97 13 14 15 16 17]
print(myArray1)  # [11 12 13 14 15 16 17]

缺失值处理

  • 判断是否有缺失值 np.isnan()
  • np.any() 是否至少有1个
  • np.all() 是否全部
import numpy as np

a = np.array([1, np.nan, 2, 3, 4, 5, 6])
print(np.isnan(a))  # [False  True False False False False False]
print(np.any(np.isnan(a)))  # True
print(np.all(np.isnan(a)))  #False
print(np.nansum(a)) #21.0 可以求和操作,类型为float 0.0
print(np.sum(a)) #nan

None是python基础语法提供的特殊数据类型,不能参加算术运算
np.nan是numpy提供的数据类型,属于float类型,可以参加算术运算

ndarray的广播规则
如果列数一样但行数不一样,进行以行为单位的广播操作

import numpy as np

a = np.array([1, 2, 3, 4])
b = np.arange(1, 13).reshape(3, 4)
print(a + b)
#[[ 2  4  6  8]
# [ 6  8 10 12]
# [10 12 14 16]]

ndarray的排序

np.sort()对矩阵从小到大进行排序
np.argsort()返回排序后的下标
多维数组按指定维度排序——np.sort()中加一个轴参数axis
axit=1

  • 计算前后的行数不变

  • 以行为单位,每行独立计算

  • 逐行计算
    axit=0

  • 计算前后的列数不变

  • 以列为单位,每列独立计算

  • 逐列计算

import numpy as np

a = np.array([1, 4, 6, 5, 7, 2, 3, 8, 10])
#'排序返回结果'
print(np.sort(a))  # [ 1  2  3  4  5  6  7  8 10]
#'排序返回下标'
print(np.argsort(a))  # [0 5 6 1 3 2 4 7 8]
a = a.reshape(3, 3)
print(a)
#[[ 1  4  6]
# [ 5  7  2]
# [ 3  8 10]]
#'按行排序'
print(np.sort(a, axis=0))
#[[ 1  4  2]
# [ 3  7  6]
# [ 5  8 10]]
# 按列排序
print(np.sort(a, axis=1))
#[[ 1  4  6]
# [ 2  5  7]
# [ 3  8 10]]
发布了28 篇原创文章 · 获赞 0 · 访问量 855

猜你喜欢

转载自blog.csdn.net/weixin_43866408/article/details/104363547