WHCSRL 技术网

NumPy库之数组创建、变换、操作、运算

# 王汉彬
# 2021/11/1 17:31
import numpy as np
def pySum():
    a=[0,1,2,3,4]
    b=[9,8,7,6,5]
    c=[]
    for i in range(len(a)):
       c.append(a[i]**2+b[i]**3)
    return c
print(pySum())

def npSum():
    a=np.array([0,1,2,3,4])
    b=np.array([9,8,7,6,5])
    c=a**2+b**3
    return c
print(pySum())

#ndarray的数组对象
a=np.array([[0,1,2,3,4],[9,8,7,6,5]])
print("ndarray数组:",a)
print("数组的维度:",a.ndim)
print("数组的尺寸(m行n列):",a.shape)
print("数组元素的个数(m*n):",a.size)
print("数组中元素的类型:",a.dtype)
print("数组中每个元素的大小,以字节为单位:",a.itemsize)


#ndarray数组的创建
'''
1.从python中的列表和元组等类型创建ndarray数组
    x=np.array(list/tuple)
    x=np.array(list/tuple,dtype=np.float32)
    当np.array()不指定dtype时,numpy将根据数据情况关联一个dtype类型
'''
# 从列表类型创建
a1=np.array([0,1,2,3])
print(a1)
# 从元组类型创建
a2=np.array((4,5,6,7))
print(a2)
# 从列表和元组混合类型创建
a3=np.array([[1,2],[9,8],(0.1,0.2)])
print(a3)

'''
2.使用numpy中函数创建ndarray数组
    1.np.arange(n) 类似range()函数,返回ndarray类型,元素从0导n-1
    2.np.ones(shape) 根据shape生成一个全1数组,shape是元组类型
    3.np.zeros(shape) 根据shape生成一个全0数组,shape是元组类型
    4.np.full(shape,val) 根据shape生成一个数组,每个元素值都是val
    5.np.eye(n) 创建一个正方的n*n单位矩阵,对角线为1,其余为0
    注意:ones zeros eye等生成的数组元素类型都是浮点数类型,除非通过dtype来指定
        arange生成的数组元素类型是整数
    6.np.ones_like(a) 根据数组a的形状生成一个全1数组
    7.np.zeros_like(a) 根据数组a的形状生成一个全0数组
    8.np.full_like(a,val) 根据数组a的形状生成一个数组,每个元素值都是val
    注意:以上三个函数在进行大规模科学计算时特别重要
'''
a4=np.arange(10)
print(a4)
a5=np.ones((3,6))
print(a5)
a6=np.zeros((3,6),dtype=np.int32)
print(a6)
a6=np.eye(5)
print(a6)
a7=np.ones((2,3,4))
print(a7)

'''
3.使用numpy中其他函数创建ndarray数组
    1.np.linspace() 根据起止数据等间距地填充数据,形成数组
    2.np.concatenate()将两个或多个数组合并成一个新的数组
'''

# 第一个参数:起始位置
# 第二个参数:最后一个元素的值
# 第三个参数:数组中包含4个元素
# np.linspace()不限定数据类型时,生成浮点数
# 运行结果[ 1.  4.  7. 10.]  间距为(10-1)/3
a8=np.linspace(1,10,4)
print(a8)
# endpoint=False表示最后一个元素10是否是生成的四个元素中的一个
# 运行结果[1.   3.25 5.5  7.75] 间距间距为(10-1)/4
a9=np.linspace(1,10,4,endpoint=False)
print(a9)
a10=np.concatenate((a8,a9))
print(a10)
'''
为什么numpy每一次生成的数组中都要报元素置为浮点数呢?
numpy是用于科学计算的一个库,科学计算中使用的基本都是浮点数
'''

#ndarray数组的变换
# 对于创建后的ndarray数组,可以对其进行维度变换和元素类型变换
'''
维度变换的常用方法
    1 .reshape(shape) 不改变数组元素,返回一个shape形状的数组,原数组不变
        保证元素的总体个数不发生改变。如(2,3,4)的可以reshape为(3,8) 均24个元素
    2 .resize(shape) 与reshape()功能一直,但修改原数组
    3 .swaoaxes(ax1,ax2) 将数组n个维度中两个维度进行调换
    4 .flatten() 对数组进行降维,返回折叠后的一维数组,原数组不变
'''

a11=np.ones((2,3,4),dtype=np.int32)
a12=a11.reshape(3,8)
print(a11) #a11并没有发生变化,原数组未改变
print(a12)
a13=a11.resize((3,8))
print(a11)#a11发生变化,原数组被改变
print(a13)
a11=np.ones((2,3,4),dtype=np.int32)
a14=a11.flatten()
print(a11)#a11没有发生变化,原数组未改变
print(a14)

'''
元素类型变换的常用方法
    1 .astype(new_type)
        astype()方法一定会创建新的数组(原始数据的一个拷贝),即使两个类型一致
'''
a15=np.ones((2,3,4),dtype=np.int32)
print(a15)
a16=a15.astype(np.float32)
print(a16)


'''
ndarray数组向列表的转换
    1 .tolist()
'''
a17=np.full((2,3,4),25,dtype=np.int32)
print(a17)
a18=a17.tolist() #原数组不变
print(a18)


# ndarray数组的操作
# 数组的索引和切片
# 索引:获取数组中特定位置元素的过程
# 切片:获取数组元素子集的过程
'''
一维数组的索引和切片:与python的列表相似
'''
a19=np.array([9,8,7,6,5])
print(a19[2])
print(a19[1:4:2])

'''
多维数组的索引
'''
a20=np.arange(24).reshape((2,3,4))
print(a20)
print(a20[1,2,3]) #print(a20[1][2][3]) 相同
print(a20[0,1,2])
print(a20[-1,-2,-3])
'''
多维数组的切片
    通过逗号“,”来区分维度,每个维度的切片方法与一维数组相同
    某个维度选取全部为 " :"
'''
#第一个维度任意,第二个维度是索引为1的元素,第三个维度是索引-3的元素
a21=a20[:,1,-3]
print(a21)
a22=a20[:,1:3,:]
print(a22)
a23=a20[:,:,::2]
print(a23)



# ndarray数组的运算
'''
1.数组与标量之间的运算:数组中的每一个元素都与这个标量进行运算
'''
a24=np.arange(24).reshape((2,3,4))
print(a24)
print(a24.mean()) #所有元素的平均值
a24=a24/a24.mean()
print(a24)

'''
2.numpy一元函数对ndarray中的数据执行元素级运算
    注意:数组x本身并没有发生变化,如果在前面加类似于x=np.abs(x)
        x本身就发生了变化
    1.np.abs(x) np.fabs(x) 计算数组各元素的绝对值
    2.np.sqrt(x) 计算数组各元素的平方根
    3.np.square(x) 计算数组各元素的平方
    4.np.log(x) np.log10(x) np.log2(x) 
        计算数组各元素的自然对数、10底对数、2底对数
    5.np.ceil(x) np.floor(x) 计算数组各元素的ceiling值或floor值
    6.np.rint(x) 计算数组各元素的四舍五入值
    7.np.modf(x) 将数组各元素的小数和整数部分以两个独立数组形式返回
    8.np.cos(x) np.sin(x) no.tan(x) 计算数组各元素的三角函数
    9.np.exp(x) 计算数组各元素的指数值
    10.np.sign(x) 计算数组各元素的符号值,1(+),0,-1(-)
'''

a25=np.arange(24).reshape((2,3,4))
a26=np.square(a25)
print(a26)
a27=np.sqrt(a25)
print(a27)
a28=np.modf(a27)
print(a28)
'''
3.numpy二元函数
    1.+ - * / ** 两个数组各对应位置的元素进行运算
    2.np.maximum(x,y) np.minimum(x,y) 元素级的最大值最小值
    3.np.mod(x,y) 元素级的模运算
    4.np.copysign(x,y) 将数组y中各元素值的符号赋值给数组x对应元素
    5.> < >= <= == != 算术比较,产生布尔型数组
'''
a29=np.arange(24).reshape((2,3,4))
a30=np.sqrt(a29)
print(a29)
print(a30)
a31=np.maximum(a29,a30)
print(a31)
a32=a29>a30
print(a32)

  • 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
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
推荐阅读