数字日期和时间03-无穷大与 NaN / 分数运算 / 数组运算

无穷大与 NaN

  • 使用 float() 创建无穷与NaN
a = float('inf')
b = float('-inf')
c = float('NaN')

print(a,',type(a)=',type(a))   # inf ,type(a)= <class 'float'>
print(b,',type(b)=',type(b))   # -inf ,type(b)= <class 'float'>
print(c,',type(c)=',type(c))   # nan ,type(c)= <class 'float'>
  • 使用 math.isinf() 和 math.isnan()测试无穷与NaN
a = float('inf')
c = float('NaN')

import math

print(math.isinf(a))  # True
print(math.isnan(c))  # True

无穷与NaN有意思的操作

a = float('inf')
b = float('-inf')
c = float('NaN')
d = float('NaN')

#无穷 / 无穷 =  非数字
print(a / a)               # nan
#正无穷 + 负无穷 = 非数字
print(a + b)               # nan
#无穷 + 非数字 = 非数字
print(a + c)               # nan
# 非数字+ 数字 = 非数字
print(c + 5)               # nan


#NaN永远不相等
print(c==d)                # False
print(c is d)              # False

分数运算

  • 使用 fractions.Fraction() 进行分数相加减

正常的分数运算,得到的往入是一个符点数,而不是分数,当结果想等于分数时,可用此法

#正常计算
c = 5/4
d = 7/16
print(c+d)            # 1.6875

#以下运用fractions.Fraction()计算

from fractions import Fraction

a = Fraction(5, 4)
b = Fraction(7, 16)
print(a)              # 5/4
print(a+b)            # 27/16
print(a*b)            # 35/64
  • 使用 numerator()获得分子与分母
from fractions import Fraction

a = Fraction(5, 4)
b = Fraction(7, 16)
F = a*b
#分子
print(F.numerator)    # 35
#分母
print(F.denominator)  # 64
  • 使用 float(),将分数转为小数(浮点数)
from fractions import Fraction

a = Fraction(5, 4)
b = Fraction(7, 16)
F = a*b

print(float(F))       # 0.546875
  • 使用.as_integer_ratio()参数将小数(浮点数)转分数
x = 3.75
y = Fraction(*x.as_integer_ratio())
print(y)              # 15/4

数组运算


  • 使用 Numpy

NumPy 的一个主要特征是它会给 Python 提供一个数组对象,相比Python 列表而更适合用来做数学运算。下面展示标准列表对象和 NumPy 数组对象之间的差别:
#python 列表
x = [1, 2, 3, 4]
y = [5, 6, 7, 8]
print(x * 2)         # [1, 2, 3, 4, 1, 2, 3, 4]
print(x + y)         # [1, 2, 3, 4, 5, 6, 7, 8]
# print(x + 10)      # 报错



#以下使用 Numpy
import numpy as np

ax = np.array([1, 2, 3, 4])
ay = np.array([5, 6, 7, 8])
print(ax * 2)        # array([2 4 6 8])
print(ax + ay)       # array([6, 8, 10, 12]),注意两数组元素个数需相等
print(ax + 10)       # array([11, 12, 13, 14])


  • 对整个数组中所有元素同时执行数学运算

对整个数组中所有元素同时执行数学运算可以使得作用在整个数组上的函数运算简
单而又快速。

#例:计算多项式的值

import numpy as np

ax = np.array([1, 2, 3, 4])
def f(x):
    return 3*x**2 - 2*x + 7

print(f(ax),type(f(ax)))  #array([ 8, 15, 28, 47])


  • 数组对象的通用函数

Numpy 为数组操作提供了大量的通用函数,这些函数可以作为 math 模块中类似函数的替代。比如:

import numpy as np

ax = np.array([1, 2, 3, 4])

print(np.sqrt(ax))  #array([ 1. , 1.41421356, 1.73205081, 2. ])
print(np.cos(ax))   #array([ 0.54030231, -0.41614684, -0.9899925 , -0.65364362])

使用这些通用函数要比循环数组并使用 math 模块中的函数执行计算要快的多。因此,只要有可能的话尽量选择 NumPy 的数组方案。

  • 构造一个 10,000*10,000 的浮点数二维网格
import numpy as np

g = np.zeros(shape=(10000,10000), dtype=float)
print(g)
'''
    [[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.]
     [0. 0. 0. ... 0. 0. 0.]]'''
print(g + 10)
'''
    [[10. 10. 10. ... 10. 10. 10.]
     [10. 10. 10. ... 10. 10. 10.]
     [10. 10. 10. ... 10. 10. 10.]
     ...
     [10. 10. 10. ... 10. 10. 10.]
     [10. 10. 10. ... 10. 10. 10.]
     [10. 10. 10. ... 10. 10. 10.]]'''

print(np.sin(g+5))
'''
    [[-0.95892427 -0.95892427 -0.95892427 ... -0.95892427 -0.95892427
      -0.95892427]
     [-0.95892427 -0.95892427 -0.95892427 ... -0.95892427 -0.95892427
      -0.95892427]
     [-0.95892427 -0.95892427 -0.95892427 ... -0.95892427 -0.95892427
      -0.95892427]
     ...
     [-0.95892427 -0.95892427 -0.95892427 ... -0.95892427 -0.95892427
      -0.95892427]
     [-0.95892427 -0.95892427 -0.95892427 ... -0.95892427 -0.95892427
      -0.95892427]
     [-0.95892427 -0.95892427 -0.95892427 ... -0.95892427 -0.95892427
      -0.95892427]]'''
  • 多维数组列表的索引功能
import numpy as np

#数组的索引
a = np.array([[1, 2, 3, 4], 
              [5, 6, 7, 8], 
              [9, 10, 11, 12]])
print(a)
'''
    array([[ 1, 2, 3, 4],
           [ 5, 6, 7, 8],
           [ 9, 10, 11, 12]])   '''

print(a[1])          # array([5, 6, 7, 8])
print(a[:,1])        # array([ 2, 6, 10])
print(a[1:3, 1:3])   # array([[ 6, 7],[10, 11]])

#选择一个区间并改变它
a[1:3, 1:3] += 10
print(a)
'''
    array([[ 1, 2, 3, 4],
           [ 5, 16, 17, 8],
           [ 9, 20, 21, 12]])   '''

#在所有行的操作上按顺序加上[100, 101, 102, 103]
print(a + [100, 101, 102, 103])
'''
    array([[101, 103, 105, 107],
          [105, 117, 119, 111],
          [109, 121, 123, 115]])   '''
print(a)
'''
    array([[ 1, 2, 3, 4],
           [ 5, 16, 17, 8],
           [ 9, 20, 21, 12]])   '''

#按条件对数组赋值
print(np.where(a < 10, a, 10))
'''
    array([[ 1, 2, 3, 4],
           [ 5, 10, 10, 8],
           [ 9, 10, 10, 10]])   '''





猜你喜欢

转载自blog.csdn.net/xiangchi7/article/details/82502525