NumPy

#1行5列
data = np.array([1,2,3,4,5])
data.shape
(5,)
#3行4列
data = np.array([[1,2,3,0],[4,5,6,0],[7,8,9,0]])  
data.shape
(3, 4)
# 2行3列2维
data = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
data.shape
(2, 2, 3)
data.dtype
dtype('int64')

1.创建ndarray

   ndarray是NumPy中多维数组对象,是一个快速而灵活的大数据容器,其中所有元素必须具有相同类型

Numpy中如果没有特殊指定,数据类型基本都是float64(浮点型)

import numpy as np

data = [6,7.5,8,0,1]

arr1 = np.array(data)   #创建一维矩阵 
arr1
array([6. , 7.5, 8. , 0. , 1. ])
arr1.shape        #返回一个表示各维度大小的元组,第一个数标识
(5,)
arr1.dtype       #返回一个说明数组数据类型的对象,numpy关注的是数值运算,默认float64 浮点数,数据类型
dtype('float64')
data = [[1,2,3,4],[5,6,7,8]]   #创建二维矩阵
arr2 = np.array(data)
arr2 
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])

zeros()

创建全0矩阵

np.zeros(10)      #创建 1x10x1  全0矩阵
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.zeros((3,6))   #创建3x6x1    全0矩阵    3行6列,1维矩阵
array([[0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.]])
np.zeros((2,3,3))  #创举3x3x2 全0矩阵    3行3列,2维矩阵
array([[[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]],

       [[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]]])

ones()

创建全1矩阵

np.ones(10)    #创建 1x10x1  全1矩阵
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
np.ones((3,6))   #创建3x6x1    全1矩阵    3行6列,1维矩阵
array([[1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1.]])
np.ones((2,3,4))
array([[[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]],

       [[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]]])

empty()

可以创建一个没有任何具体值的数组

np.empty((2,3,2))   # 2列,3行,2维
                    #返回的是未经初始化的垃圾值
array([[[6.94646086e-310, 4.64671213e-310],
        [6.94645989e-310, 6.94645967e-310],
        [6.94645994e-310, 3.21142670e-322]],

       [[6.94646086e-310, 4.64671213e-310],
        [0.00000000e+000, 0.00000000e+000],
        [0.00000000e+000, 0.00000000e+000]]])

arange()

是python内置函数range的数组版本,返回的是一个ndarray而不是列表

np.arange(15)
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

2.ndarray的数据类型

类型类型代码说明
int8,uint8i1,u1有符号和无符号的8位(1字节)整型
int16,uint16i2,u2有符号和无符号的16位(2字节)整型
int32,uint32i4,u4有符号和无符号的32位(4字节)整型
int64,uint64i8,u8有符号和无符号的64位(8字节)整型
float16f2半精度浮点数
float32f4或f标准的单精度浮点数.与C的float兼容
float64f8或d标准双精度浮点数.与C的double和python的float对象兼容
float128f16或g扩展精度浮点数
complex64,complex128,complex256c8,c16,c32分别用两个32位,64位或128位浮点数表示的复数
bool?存储True和False值的布尔类型
objectOPython对象类型
string_S固定长度的字符串类型(每个字符1个字节).
例如:要创建一个长度为10的字符串,应使用S10
unicode_U固定长度的unicode类型(字节数由平台决定).
跟字符串的定义方式一样(如U10)

2.1 astype()数据类型转化

调用astype无论如何都会创建出一个新的数组(原始数组的一份拷贝),即使新dtype跟老dtype相同也是如此

注意 浮点数(比如float64和float32)只能表示近似的分数值.在复杂计算中,由于可能会积累一些浮点错误,因此比较操作只能在一定小数位内有效

整数转为浮点数

arr = np.array([1,2,3,4,5])
arr.dtype
dtype('int64')
float_arr = arr.astype(np.float64)
float_arr.dtype
dtype('float64')

浮点数转为整数

转换过程中小数部分会直接被截断

arr = np.array([3.7,-1.2,-2.6,0.5,12.9,10.1])
arr.dtype
dtype('float64')
arr.astype(np.int32)
array([ 3, -1, -2,  0, 12, 10], dtype=int32)

全是数字的字符串数组 转为 数值

numeric_strings = np.array(['1.25','-9.6','42'],dtype=np.string_)
numeric_strings.astype(float)
array([ 1.25, -9.6 , 42.  ])
numeric_strings.astype(np.float64)
array([ 1.25, -9.6 , 42.  ])

支持参数是返回的数据类型

int_array = np.arange(10)
calibers = np.array([.27,.270,.357,.380,.44,.50],dtype=np.float64)
int_array.astype(calibers.dtype)
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])

使用类型代码定义数据类型

empty_uint32 = np.empty(8,dtype='u4')
empty_uint32
array([         0, 1075314688,          0, 1075707904,          0,
       1075838976,          0, 1072693248], dtype=uint32)

3.索引和切片

3.1 一维数组

arr = np.arange(10)
arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[:]
array([ 0,  1,  2,  3,  4, 12, 12, 12,  8,  9])
arr[5]        #第6个元素
5
arr[5:8]      #第6个元素到第8个元素
array([5, 6, 7])

数组中 值的更改

跟列表最重要的区别在于,数组切片是原始数组的视图.这意味着数据不会被复制,视图上的任何修改都会直接反应到源数据上

arr[5:8] = 12
arr
array([ 0,  1,  2,  3,  4, 12, 12, 12,  8,  9])
arr_slice = arr[5:8]
arr_slice
array([12, 12, 12])
arr_slice[1] = 145
arr
array([  0,   1,   2,   3,   4,  64, 145,  64,   8,   9])
arr_slice[:] = 64
arr
array([ 0,  1,  2,  3,  4, 64, 64, 64,  8,  9])
其他用法
old_data = data.copy()
data[data < 0] = 0
data
array([[0.        , 1.69865101, 0.        , 0.49518769],
       [0.37951591, 0.        , 0.        , 0.        ],
       [0.44686031, 2.0746266 , 1.68538262, 0.        ],
       [0.37011546, 0.        , 0.7600543 , 0.        ],
       [0.        , 0.        , 0.        , 0.        ],
       [0.        , 0.79192211, 0.        , 0.        ],
       [2.92470818, 0.        , 0.26734807, 0.94358864]])
data[names != 'Joe'] = 7
data
array([[7.        , 7.        , 7.        , 7.        ],
       [0.37951591, 0.        , 0.        , 0.        ],
       [7.        , 7.        , 7.        , 7.        ],
       [7.        , 7.        , 7.        , 7.        ],
       [7.        , 7.        , 7.        , 7.        ],
       [0.        , 0.79192211, 0.        , 0.        ],
       [2.92470818, 0.        , 0.26734807, 0.94358864]])

3.2 二维数组

各索引位置上的元素不再是标量而是一维数组

arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr2d
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
arr2d[2]              #获取 第3行元素
array([7, 8, 9])
print(arr2d[0][2])      #获取 1行3列的值
print(arr2d[0,2])
3
3
arr2d[:1]         #返回第 1行
array([[1, 2, 3]])
arr2d[:2]         #返回前 2行
array([[1, 2, 3],
       [4, 5, 6]])
arr2d[:3]        #返回前 3行,即所有
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
arr2d[:2,1:]     # 返回前2行, 从第 2列到最后一列 所有元素
array([[2, 3],
       [5, 6]])
arr2d[:2,2:]     # 返回前2行,从第 3列到最后一列(即最后一列)所有元素
array([[3],
       [6]])
arr2d[:2,:1]     # 返回前 2行,第 1列的值
array([[1],
       [4]])
arr2d[:2,:2]     # 返回前 2行,第 1列 到 第 2列的值
array([[1, 2],
       [4, 5]])
arr2d[:2,1:2]    # 返回前 2行,第 2列的值
array([[2],
       [5]])

3.3 多维数组

第一个数表示 维度, 第二个数表示行, 第三个数表示列

arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
arr3d    # 2行3列2维度
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])
arr3d[0]     # 返回第一维度的数组
array([[1, 2, 3],
       [4, 5, 6]])
arr3d[1,0]   # 返回第二维度第一行数据
array([7, 8, 9])

3.4 复制–数组切片

.copy() 得到的是ndarray切片的一份副本而非视图

old_values = arr3d[0].copy()
arr3d[0] = 42
arr3d
array([[[42, 42, 42],
        [42, 42, 42]],

       [[ 7,  8,  9],
        [10, 11, 12]]])
arr3d[0] = old_values
arr3d
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])

3.5 布尔型索引

布尔型数组的长度必须跟被索引的数组的行数一致

Python关键字 and 和 or 在布尔型数组中无效

names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
data = np.random.randn(7,4)   #使用numpy.random中的randn函数生成一些正态分布的随机数
names
array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4')
data
array([[-0.69367557,  1.69865101, -0.23921684,  0.49518769],
       [ 0.37951591, -1.12286914, -0.45468043, -0.0389243 ],
       [ 0.44686031,  2.0746266 ,  1.68538262, -0.10811949],
       [ 0.37011546, -0.65505409,  0.7600543 , -1.97341031],
       [-0.31347836, -1.11806019, -1.11968691, -0.73714439],
       [-0.94361467,  0.79192211, -0.23550452, -0.02805382],
       [ 2.92470818, -0.32589702,  0.26734807,  0.94358864]])
names == 'Bob'
array([ True, False, False,  True, False, False, False])
data[names == 'Bob']        # 返回第1行 和 第4行
array([[-0.69367557,  1.69865101, -0.23921684,  0.49518769],
       [ 0.37011546, -0.65505409,  0.7600543 , -1.97341031]])
data[names == 'Bob',2:]      # 返回第1行和第4行, 第3列到最后一列的值
array([[-0.23921684,  0.49518769],
       [ 0.7600543 , -1.97341031]])
data[names == 'Bob',3]      #将第4列,第1行和4行的值组成数组
array([ 0.49518769, -1.97341031])
使用 != 非 ~
names != 'Bob'
array([False,  True,  True, False,  True,  True,  True])
data[~(names == 'Bob')]      #返回非1和4行
array([[ 0.37951591, -1.12286914, -0.45468043, -0.0389243 ],
       [ 0.44686031,  2.0746266 ,  1.68538262, -0.10811949],
       [-0.31347836, -1.11806019, -1.11968691, -0.73714439],
       [-0.94361467,  0.79192211, -0.23550452, -0.02805382],
       [ 2.92470818, -0.32589702,  0.26734807,  0.94358864]])
使用 &(和), |(或)
mask = (names == 'Bob') | (names == 'Will')
mask
array([ True, False,  True,  True,  True, False, False])
data[mask]
array([[-0.69367557,  1.69865101, -0.23921684,  0.49518769],
       [ 0.44686031,  2.0746266 ,  1.68538262, -0.10811949],
       [ 0.37011546, -0.65505409,  0.7600543 , -1.97341031],
       [-0.31347836, -1.11806019, -1.11968691, -0.73714439]])

3.6 花式索引

指利用整数数组进行索引
花式索引跟切片不一样,它总是将数据复制到新数组中

arr = np.empty((8,4))
for i in range(8):
    arr[i] = i
arr
array([[0., 0., 0., 0.],
       [1., 1., 1., 1.],
       [2., 2., 2., 2.],
       [3., 3., 3., 3.],
       [4., 4., 4., 4.],
       [5., 5., 5., 5.],
       [6., 6., 6., 6.],
       [7., 7., 7., 7.]])

以特定顺序选取行子集

传入一个用于指定的整数 列表 或ndarray即可

arr[[4,3,0,6]]
array([[4., 4., 4., 4.],
       [3., 3., 3., 3.],
       [0., 0., 0., 0.],
       [6., 6., 6., 6.]])
#使用负数索引将从末尾开始选取行
arr[[-3,-5,-7]]
array([[5., 5., 5., 5.],
       [3., 3., 3., 3.],
       [1., 1., 1., 1.]])
arr = np.arange(32).reshape((8,4))
arr
array([[ 0,  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]])
#矩阵(0,0)开始
#返回(1,0),(5,3),(7,1),(2,2)
arr[[1,5,7,2],[0,3,1,2]]    
array([ 4, 23, 29, 10])
arr[[1,5,7,2]][:,[0,3,1,2]]
array([[ 4,  7,  5,  6],
       [20, 23, 21, 22],
       [28, 31, 29, 30],
       [ 8, 11,  9, 10]])
np.ix_函数,它可以将两个一维数组转换为一个用于选取方形区域的索引器
arr[np.ix_([1,5,7,2],[0,3,1,2])]
array([[ 4,  7,  5,  6],
       [20, 23, 21, 22],
       [28, 31, 29, 30],
       [ 8, 11,  9, 10]])

4. 数组转置和轴对称

arr = np.arange(15).reshape((3,5))
arr
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

Transpose 转置

转置是一种特殊形式,返回的是源数据的视图(不会进行任何复制操作)

arr.T
array([[ 0,  5, 10],
       [ 1,  6, 11],
       [ 2,  7, 12],
       [ 3,  8, 13],
       [ 4,  9, 14]])
arr = np.arange(16).reshape((2,2,4))
arr
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])
arr.T
array([[[ 0,  8],
        [ 4, 12]],

       [[ 1,  9],
        [ 5, 13]],

       [[ 2, 10],
        [ 6, 14]],

       [[ 3, 11],
        [ 7, 15]]])

np.dot() 计算矩阵内积 X T X X^TX XTX

arr
np.dot(arr.T,arr)
array([[125, 140, 155, 170, 185],
       [140, 158, 176, 194, 212],
       [155, 176, 197, 218, 239],
       [170, 194, 218, 242, 266],
       [185, 212, 239, 266, 293]])

swapaxes()

arr = np.arange(16).reshape((2,2,4))
arr.swapaxes(1,2)
array([[[ 0,  4],
        [ 1,  5],
        [ 2,  6],
        [ 3,  7]],

       [[ 8, 12],
        [ 9, 13],
        [10, 14],
        [11, 15]]])

5.通用函数(ufunc)

一元ufunc

函数说明
abs,fabs计算整数,浮点数或复数的绝对值
对于非复数值,可以使用更快的fabs
sqrt计算各元素的平方根
square计算各元素的平方
exp计算各元素的指数 e x e^{x} ex
log,log10,log2,log1p分别为自然对数(底数为e),底数为10的log,底数为2的log,log(1+x)
sign计算各元素的正负号:1(正数),0(零),-1(负数)
ceil计算各元素的ceiling值,即大于等于该值的最小整数
floor计算个元素的floor值,即小于等于该值的最大整数
rint将各元素值四舍五入到最接近的整数,保留dtype
modf将数组的小数和整数部分以两个独立数组的形式返回
isnan返回一个表示"哪些值是NaN(这不是一个数字)"的布尔型数组
isfinite,isinf分别返回一个表示"哪些元素是又穷的(非inf,非NaN)"或"哪些元素是无穷的"的布尔型数组
cos,cosh,sin,sinh,tan,tanh普通型和双曲型三角函数
arccos,arccosh,arcsin,arcsinh,arctan,arctanh反三角函数
logical_not计算各元素not x的真值
import numpy as np
arr = np.arange(10)
arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.sqrt(arr)
array([0.        , 1.        , 1.41421356, 1.73205081, 2.        ,
       2.23606798, 2.44948974, 2.64575131, 2.82842712, 3.        ])
np.exp(arr)
array([1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01,
       5.45981500e+01, 1.48413159e+02, 4.03428793e+02, 1.09663316e+03,
       2.98095799e+03, 8.10308393e+03])

二元ufunc

函数说明
add将数组中对应的元素相加
subtract从第一个数组中减去第二个数组中的元素
multiply数组元素相乘
divide,floor_divide除法或向下圆整除法(丢弃余数)
power对第一个数组的元素A,根据第二个数组中的相应元素B,计算 A B A^B AB
maximum,fmax元素级的最大值计算.fmax将忽略NaN
minimum,fmin元素级的最小值计算.fmin将忽略NaN
mod元素级的求模计算(除法的余数)
copysign
greater,greater_equal,less,less_equal,equal,not_equal执行元素级的比较运算,最终产生布尔型数组.相当于中缀运算>,>=,<,<=,==,!=
logical_and,logical_or,logical_xor执行元素级的真值逻辑运算.
相当于&,|,^
x = np.random.randn(8)
x
array([ 0.7782637 ,  2.01053018,  1.35868291,  0.21749182,  0.01305496,
        0.38470116, -1.57178628,  2.19639081])
y = np.random.randn(8)
y
array([ 1.28050252, -1.77657855,  0.23944536,  0.21039616, -0.75090526,
        1.06167301,  0.18368341, -0.63631676])
np.maximum(x,y)
array([1.28050252, 2.01053018, 1.35868291, 0.21749182, 0.01305496,
       1.06167301, 0.18368341, 2.19639081])
np.modf(x)
(array([ 0.7782637 ,  0.01053018,  0.35868291,  0.21749182,  0.01305496,
         0.38470116, -0.57178628,  0.19639081]),
 array([ 0.,  2.,  1.,  0.,  0.,  0., -1.,  2.]))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值