Numpy的理解与应用(二)

NumPy中的运算可以理解为三个部分:通用运算、数学运算、线性代数。下面将分别介绍。
一、通用运算
这部分有位运算和字符串运算。
1、位运算
NumPy中的位运算是基于对象的二进制来进行操作的,主要有以下函数:
1)bin()函数和binary_repr()函数
bin()函数返回一个数的真值:即包含符号的二进制;binary_repr()函数返回一个数的补码,可以调整宽度。由于计算机的运算是基于补码的运算,这个函数的用处是很大的。

np.binary_repr(-1,width = 8)
Out[27]: '11111111'

2)对数组元素执行“位与(bitwise_and)”或者“位或(bitwise_or)”操作

import numpy as np
print('9和17的二进制形式:')
a,b=9,17
print(bin(a),bin(b))
print('\n')
print('9和17的位与:')
print(np.bitwise_and(9,17))
print('9和17的位或:')
print(np.bitwise_or(9,17))

运行结果是:

9和17的二进制形式:
0b1001 0b10001


9和17的位与:
1
9和17的位或:
25

下表是二进制的与/或操作:
在这里插入图片描述
3)对数组中整数进行位取反运算,即0变成1,1变成0.使用invert()函数
注:对于有符号整数,取该二进制数的补码,然后逐位取反操作。
正数的取反操作是可逆的,负数的取反操作不可逆。并且,运算的结果与二进制的位数相关。
正数的反转:


print('9的位反转,其中的ndarray的dtype是uint8:')
print(np.invert(np.array([9],dtype=np.uint8)))
print(np.invert(np.array([246],dtype=np.uint8)))
运行结果:
9的位反转,其中的ndarray的dtype是uint8:
[246]
[9]

查看真值与补码:

print(np.binary_repr(9,width = 8))
print(bin(9))
print(np.binary_repr(246,width = 8))
print(bin(246))
运行结果:
00001001
0b1001
11110110
0b11110110

负数的反转:

print('-9的位反转,其中的ndarray的dtype是uint8:')
print(np.invert(np.array([-9],dtype=np.uint8)))
运行结果:
-9的位反转,其中的ndarray的dtype是uint8:
[8]

同样查看真值与补码:

print(np.binary_repr(-9,width = 8))
print(bin(-9))
print(np.binary_repr(8,width = 8))
print(bin(8))
运行结果:
11110111
-0b1001
00001000
0b1000

2、字符串函数
NumPy中的字符串函数用于对 dtype 为 numpy.string_ 或 numpy.unicode_ 的数组执行向量化字符串操作,主要有以下函数:

函数描述
add()对两个数组的逐个字符串元素进行连接
multiply()multiply() 返回按元素多重连接后的字符串
center()居中字符串
capitalize()将字符串第一个字母转换为大写
title()将字符串的每个单词的第一个字母转换为大写
lower()数组元素转换为小写
upper()数组元素转换为大写
split()指定分隔符对字符串进行分割,并返回数组列表
splitlines()返回元素中的行列表,以换行符分割
strip()移除元素开头或者结尾处的特定字符
join()通过指定分隔符来连接数组中的元素
replace()使用新字符串替换字符串中的所有子字符串
decode()数组元素依次调用str.decode
encode()数组元素依次调用str.encode

二、数学运算
数学运算以函数的形式来实现数学方面的计算功能,主要的模块如下:
1、基础运算
在这里插入图片描述
以下以三角函数和反三角函数举例:(计算结果可能受三角函数的性质影响)

import numpy as np
a=np.array([0,30,45,60,70,80])
print('含有正弦值的数组')
sin=np.sin(a*np.pi/180)
print(sin)
print('\n')
print('计算角度的反正弦,返回值以弧度为单位:')
inv1=np.arcsin(sin)
print(inv1)
print('\n')
print('通过转化为角度制来检查结果:')
print(np.degrees(inv1))
print('\n')
print('arccos和arctan函数类似:')
cos=np.cos(a*np.pi/180)
print(cos)
print('\n')
print('反余弦:')
inv2=np.arccos(cos)
print(inv2)
print('\n')
print('角度制单位: ')
print(np.degrees(inv2))
print('\n')
print('tan函数')
tan=np.tan(a*np.pi/180)
print(tan)
print('\n')
print('反正切:')
inv3=np.arctan(tan)
print(inv3)
print('\n')
print('角度制单位: ')
print(np.degrees(inv3))

运行结果是:

含有正弦值的数组
[0.         0.5        0.70710678 0.8660254  0.93969262 0.98480775]


计算角度的反正弦,返回值以弧度为单位:
[0.         0.52359878 0.78539816 1.04719755 1.22173048 1.3962634 ]


通过转化为角度制来检查结果:
[ 0. 30. 45. 60. 70. 80.]


arccos和arctan函数类似:
[1.         0.8660254  0.70710678 0.5        0.34202014 0.17364818]


反余弦:
[0.         0.52359878 0.78539816 1.04719755 1.22173048 1.3962634 ]


角度制单位: 
[ 0. 30. 45. 60. 70. 80.]


tan函数
[0.         0.57735027 1.         1.73205081 2.74747742 5.67128182]


反正切:
[0.         0.52359878 0.78539816 1.04719755 1.22173048 1.3962634 ]


角度制单位: 
[ 0. 30. 45. 60. 70. 80.]

2、算术函数
在这里插入图片描述
以下以加减乘除为例,说明:
i、在numpy中的算术函数中,涉及维度不同的数组,广播功能可自动执行,并且行、列均可自动广播
Ii、在numpy中的算术函数中,算术函数是对于每个数组相同索引部分的数值分别操作,并且将结果以同样的shape返回。

a=np.arange(9,dtype=np.float_).reshape(3,3)
print('第一个数组:')
print(a)
print('\n')
print('第二个数组')
b=np.array([[7],[8],[9]])
print(b)
print('\n')
print('两个数组相加')
print(np.add(a,b))
print('\n')
print('两个数组相减')
print(np.subtract(a,b))
print('\n')
print('两个数组相乘')
print(np.multiply(a,b))
print('\n')
print('两个数组相除')
print(np.divide(a,b))

运行结果为

第一个数组:
[[0. 1. 2.]
 [3. 4. 5.]
 [6. 7. 8.]]


第二个数组
[[7]
 [8]
 [9]]


两个数组相加
[[ 7.  8.  9.]
 [11. 12. 13.]
 [15. 16. 17.]]


两个数组相减
[[-7. -6. -5.]
 [-5. -4. -3.]
 [-3. -2. -1.]]


两个数组相乘
[[ 0.  7. 14.]
 [24. 32. 40.]
 [54. 63. 72.]]


两个数组相除
[[0.         0.14285714 0.28571429]
 [0.375      0.5        0.625     ]
 [0.66666667 0.77777778 0.88888889]]

3、统计函数
在这里插入图片描述
以下举一个基本的描述性统计为例(在pandas中,基本的描述性统计可以有更简单的方法)

import numpy as np
a=np.arange(0,30,2).reshape(3,5)
print('我们的数组是:')
print(a)
print('极差是(ptp()函数)')
print(np.ptp(a))
print('横轴的极差')
print(np.ptp(a,axis=1))
print('\n')
print('纵轴的极差')
print(np.ptp(a,axis=0))
print('\n')
print('横轴均值(调用mean()函数)')
print(np.mean(a,axis=1))
print('\n')
print('横轴中位数(调用median())')
print(np.median(a,axis=1))
print('横轴标准差(调用std())')
print(np.std(a,axis=1))
print('\n')
print('横轴百分位数(调用percentile())')
print(np.percentile(a,50,axis=1))

运行结果是:

我们的数组是:
[[ 0  2  4  6  8]
 [10 12 14 16 18]
 [20 22 24 26 28]]
极差是(ptp()函数)
28
横轴的极差
[8 8 8]


纵轴的极差
[20 20 20 20 20]


横轴均值(调用mean()函数)
[ 4. 14. 24.]


横轴中位数(调用median())
[ 4. 14. 24.]
横轴标准差(调用std())
[2.82842712 2.82842712 2.82842712]


横轴百分位数(调用percentile())
[ 4. 14. 24.]

4、排序函数
在这里插入图片描述
注:此处不涉及排序的具体算法
以对单一数组进行排序为例说明

a=np.array([[1,9,2,10],[3,18,24,6]])
print('我们的数组是')
print(a)
print('\n')
print('整体排序')
print(np.sort(a))
print('\n')
print('横轴排序')
print(np.sort(a,axis=1))
print('\n')
print('排序后的索引(整体排序)')
y=np.argsort(a)
print(y)
print('\n')
print('使用循环重构原数组')
for i in y[0]:
    print(a[0][i],end=" ")
print('\n')
for j in y[1]:
    print(a[1][j],end=" ")
print('\n')
print('按位置排序,原数组是')
print(a)
print('排序后的结果')
print(np.partition(a,1,axis=1))
print('位置排序后的新的索引')
np.argpartition(a,1,axis=1)

运行结果是:

我们的数组是
[[ 1  9  2 10]
 [ 3 18 24  6]]


整体排序
[[ 1  2  9 10]
 [ 3  6 18 24]]


横轴排序
[[ 1  2  9 10]
 [ 3  6 18 24]]


排序后的索引(整体排序)
[[0 2 1 3]
 [0 3 1 2]]


使用循环重构原数组
1 2 9 10 

3 6 18 24 

按位置排序,原数组是
[[ 1  9  2 10]
 [ 3 18 24  6]]
排序后的结果
[[ 1  2  9 10]
 [ 3  6 24 18]]
位置排序后的新的索引
Out[64]: 
array([[0, 2, 1, 3],
       [0, 3, 2, 1]], dtype=int64)

5、筛选函数
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值