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、筛选函数