Numpy 基础快速了解和查询

官方文档

numpy 是 python 的强大科学计算库, 它让 python 处理数据, 进行科学计算变得极其便捷, 高效

一, N 维数组 ndarray 对象

1, ndaraay 介绍

ndarray 是具有相同类型和大小的项目的多维容器, 它的数据存储效率和输入输出性能远远优于 python 中等价的数据结构

1.01, 理解 ndarray

创建 ndarray: np.array(), np.ndarray(), 下面只介绍 3 维以下数组, 理解它们的结构

import numpy as np  

# 一维  
a = np.array((2,3))  
# 二维,2 行 3 列
b = np.ndarray((2,3))
a
array([2, 3])
b
array([[0., 0., 0.],
       [0., 0., 0.]])
a.dtype, b.dtype # 类型
(dtype('int32'), dtype('float64'))
c = np.array((1,'2'))
c
array(['1', '2'], dtype='<U11')
type(c), type(c[0])
(numpy.ndarray, numpy.str_)

可见, ndarray 对象中的元素类型只有一种, 如上例,都统一成 Unicode, 元素位长是 11, 所以说 ndarray 是一个具有相同类型和大小的项目的多维容器

一维就是一行,二维就像一个表格, 横着是一行, 竖着是一列

# 三维  
np.ndarray((3, 3, 3))  
array([[[6.23042070e-307, 7.56587584e-307, 1.37961302e-306],
        [6.23053614e-307, 6.23053954e-307, 9.34609790e-307],
        [8.45593934e-307, 9.34600963e-307, 9.34598925e-307]],

       [[1.42418715e-306, 1.95819401e-306, 1.37961370e-306],
        [6.23054633e-307, 9.34598926e-307, 6.89804132e-307],
        [9.34598926e-307, 8.01091099e-307, 1.24610927e-306]],

       [[8.90094053e-307, 1.02361342e-306, 7.56593017e-307],
        [1.60219035e-306, 8.90111708e-307, 6.89806849e-307],
        [9.34601642e-307, 1.42410974e-306, 5.97819431e-322]]])

三维类似一个 excel 文件里的多个表格

1.02, ndarray 对象计算的优势

用实例来对比利用 ndarray 进行计算的优势

import random  
import time  
# 假设有如下列表和 array, 使其中每个数都变成它的平方  
a1 = [random.random() for i in range(100000000)]  
# a2 = np.array(a1)  

t1 = time.time()  
b = [i**2 for i in a1]  
t2 = time.time()  
a2 = np.array(a1)  
c = a2**2  
t3 = time.time()  
print(t2 - t1, t3 - t2, sep='\n')  
15.133688688278198
4.770834445953369

差距非常明显(如果 a2 在计算之前就已经是 ndarray 对象会更明显), numpy 有其自身机制(广播)实现快速计算

1.03, ndarray 的数据类型和常量

ndarray 对象数据的数据类型有 bool, int, float, U(字符串), O(python 对象)等, 查看数据类型用 dtype

import numpy as np  
a = np.array([1, 'a', np.nan])  
a.dtype, a[0].dtype, a[2].dtype  
(dtype('<U32'), dtype('<U1'), dtype('<U3'))
np.array(True).dtype  
dtype('bool')
np.array(123456).dtype  
dtype('int32')
np.array(3.1415926).dtype  
dtype('float64')
np.array(list).dtype  
dtype('O')

ndarray 对象数据的常量有 pi, e, nan (空值), inf (无穷大)等

np.pi  
3.141592653589793
np.e  
2.718281828459045
np.nan  
nan
np.inf  
inf

2, ndarray 的属性

常用 ndarray 对象的属性

a = np.array([[1, 2, 3], [4, 5, 6]])  
a  
array([[1, 2, 3],
       [4, 5, 6]])

查看数组形状 (行, 列), 这在数据处理和计算时非常有用, 例如遍历出所有行或列

a.shape  
(2, 3)
# 遍历所有列  
for i in range(a.shape[1]):  
    print(a[:, i])  
[1 4]
[2 5]
[3 6]

查看数组维度

a.ndim  
2

查看数组元素个数

a.size  
6

查看数组类型

a.dtype  
dtype('int32')

查看数组元素的大小, 字节为单位

a.itemsize  
4

数组转置, 就是行列互换

a.T  
array([[1, 4],
       [2, 5],
       [3, 6]])

二, ndarray 对象的切片操作

1, 切片取值

ndarray 的切片操作和 python 类似, 一维切片 [起始:结束:步长], 二维的切片 [起始行:结束行:步长, 起始列:结束列:步长][[行, ...], [列, ...]]

a = np.arange(20)  
a.shape = (4, 5)  
a 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
# 第一行的第 1, 3, 5 个数  
a[0][0::2]  
array([0, 2, 4])
a[2, 3] 
13
a[0:2, 1:5]  
array([[1, 2, 3, 4],
       [6, 7, 8, 9]])
a[0:3:2, 0:4:2]  
array([[ 0,  2],
       [10, 12]])
a[[1, 3], 0:3]  
array([[ 5,  6,  7],
       [15, 16, 17]])

还可以通过逻辑运算取值

# 取出数组中的数翻倍之后小于 15 的数  
# 结果展开为 1 维  
a[a * 2 < 15]  
array([0, 1, 2, 3, 4, 5, 6, 7])
# & 与  
a[(a < 5) & (a > 1)]  
array([2, 3, 4])
# | 或  
a[(a < 3) | (a > 15)]  
array([ 0,  1,  2, 16, 17, 18, 19])
# ~ 非  
a[~ (a > 3)]  
array([0, 1, 2, 3])

2, 利用切片修改值

切片修改值, 其实就是将取到的值重新赋值

a[~ (a > 3)] = 1  
a  
array([[ 1,  1,  1,  1,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
# 将 1 修改为 nan, nan 是 float 类型,   
# 保证类型一致性, 需要将 a 转为 float  
a = a.astype(float)  
a[a == 1] = np.nan  
a  
array([[nan, nan, nan, nan,  4.],
       [ 5.,  6.,  7.,  8.,  9.],
       [10., 11., 12., 13., 14.],
       [15., 16., 17., 18., 19.]])
# 任何 nan 都不等于 nan,   
# 利用此特性取 nan, 或非 nan 的数  
a[a != a], a[a == a]  
(array([nan, nan, nan, nan]),
 array([ 4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12., 13., 14., 15., 16.,
        17., 18., 19.]))
# 交换行, 交换列  
a[[0, 3], :] = a[[3, 0], :]  
a[:, [4, 0]] = a[:, [0, 4]]  
a  
array([[19., 16., 17., 18., 15.],
       [ 9.,  6.,  7.,  8.,  5.],
       [14., 11., 12., 13., 10.],
       [ 4., nan, nan, nan, nan]])

三, ndarray 对象的运算及其方法

1, ndarray 的运算

numpy 在运算时, 会通过广播机制, 将运算相对应到每个元素上:

数和数组计算, 数会和数组中的每一个元素进行计算

# 方法 reshape 用于设置数组的形状, 后面会说  
import numpy as np  

a = np.arange(9).reshape((3, 3))  
a  
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
b = -a * 2  
b  
array([[  0,  -2,  -4],
       [ -6,  -8, -10],
       [-12, -14, -16]])

相同形状的多维数组之间的运算, 对应位置的元素进行计算

a + b  
array([[ 0, -1, -2],
       [-3, -4, -5],
       [-6, -7, -8]])
# 行相同  
a[1] + (a + b)  
array([[ 3,  3,  3],
       [ 0,  0,  0],
       [-3, -3, -3]])

二维一列的数组和多维数组之间的运算, 需要列元素个数相同, 然后一一对应并广播计算

# 列相同  
# a 的列取出来成了一维, 需要转为二维  
a[:, 1].reshape((3, 1)) + (a + b)  
array([[ 1,  0, -1],
       [ 1,  0, -1],
       [ 1,  0, -1]])

2, 常用 ndarray 对象的方法

就是直接用 ndarray 对象调用的方法

2.01, 形状操作

flatten 或 ravel 将多维数组展开为一维, 不改变原数组

a  
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
# 默认参数 'C' 以行展开, 'F' 以列展开  
display(a.flatten())  
display(a.flatten('F'))  
a.ravel('F')  
array([0, 1, 2, 3, 4, 5, 6, 7, 8])



array([0, 3, 6, 1, 4, 7, 2, 5, 8])





array([0, 3, 6, 1, 4, 7, 2, 5, 8])

reshape 修改数组的形状, 不改变原数组, 行列数相乘要等于元素总数; resize 就地修改原数组形状

# 默认以行展开修改  
import numpy as np  
b = np.arange(12).reshape((3, 4))  
display(b)  
b.reshape((2, 6), order='F')  
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])





array([[ 0,  8,  5,  2, 10,  7],
       [ 4,  1,  9,  6,  3, 11]])
# 就地修改 b  
display(b)  
b.resize((4, 3))  
b  
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])





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

2.02, 转换类型

tolist 数组转列表

b.tolist()  
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]

astype 改变数组类型

b.astype(float)  
array([[ 0.,  1.,  2.],
       [ 3.,  4.,  5.],
       [ 6.,  7.,  8.],
       [ 9., 10., 11.]])

2.03, 修改, 排序及查找

fill 给原数组重新填值, 类型不变

b[0].fill(2.01)  
b  
array([[ 2,  2,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])

sort 就地排序, 参数 0 将列排序, 1 将行排序

a = np.array([[3, 0, 5], [8, 4, 6], [0, 7, 3]])  
a.sort(0)  
a  
array([[0, 0, 3],
       [3, 4, 5],
       [8, 7, 6]])
a.argsort() # 返回排序后的索引位置  
array([[0, 1, 2],
       [0, 1, 2],
       [2, 1, 0]], dtype=int64)

nonzero 返回非零元素的索引, 行坐标一个数组, 列坐标一个数组

a.nonzero()  
(array([0, 1, 1, 1, 2, 2, 2], dtype=int64),
 array([2, 0, 1, 2, 0, 1, 2], dtype=int64))

2.04, 计算

max 返回最大值, 给定轴将返回给定轴的最大值, argmax 返回索引, 与之对应的还有最小min 和 argmin

# 参数 0 列的最大值, 参数 1 行的最大值  
a = np.arange(1.01, 13.13, 1.01).reshape(3, 4)  
print(a)  
print(a.max(), a.max(axis=0), a.max(axis=1))  
[[ 1.01  2.02  3.03  4.04]
 [ 5.05  6.06  7.07  8.08]
 [ 9.09 10.1  11.11 12.12]]
12.12 [ 9.09 10.1  11.11 12.12] [ 4.04  8.08 12.12]
# 参数 0 行索引, 1 列索引  
print(a.argmax(), a.argmax(0), a.argmax(1))  
11 [2 2 2 2] [3 3 3]

ptp 返回极值或给定轴的极值(最大-最小)

a.ptp(), a.ptp(axis=0), a.ptp(axis=1)  
(11.11, array([8.08, 8.08, 8.08, 8.08]), array([3.03, 3.03, 3.03]))

clip 返回指定值之间的数组, 小于或大于指定值的, 用指定值填充

a.clip(2, 6)  
array([[2.  , 2.02, 3.03, 4.04],
       [5.05, 6.  , 6.  , 6.  ],
       [6.  , 6.  , 6.  , 6.  ]])

round 四舍五入到指定位数

a.round(1)  
array([[ 1. ,  2. ,  3. ,  4. ],
       [ 5. ,  6.1,  7.1,  8.1],
       [ 9.1, 10.1, 11.1, 12.1]])

sum 求和, cumsum 累积求和

print(a.sum()) # 总和  
print(a.sum(0)) # 列求和  
print(a.sum(1)) # 行求和  
78.78
[15.15 18.18 21.21 24.24]
[10.1  26.26 42.42]
print(a.cumsum()) # 全部累积  
print(a.cumsum(0)) # 列累积  
print(a.cumsum(1)) # 行累积  
[ 1.01  3.03  6.06 10.1  15.15 21.21 28.28 36.36 45.45 55.55 66.66 78.78]
[[ 1.01  2.02  3.03  4.04]
 [ 6.06  8.08 10.1  12.12]
 [15.15 18.18 21.21 24.24]]
[[ 1.01  3.03  6.06 10.1 ]
 [ 5.05 11.11 18.18 26.26]
 [ 9.09 19.19 30.3  42.42]]

类似还有 mean 均值, var 方差, std 标准差, prod 乘积, cumprod 累积乘积, 不在一一举例

all 数组所有元素都判断为 True, 返回 True, 而 any 只要任何一个 True 返回 True

a = np.array([1, 2])  
b = np.array([0, 0])  
a.all(), b.all(), a.any(), b.any()  
(True, False, True, False)

四, 创建或生成 ndarray 对象

1, 生成随机数

利用 numpy 生成随机数的模块 random, 创建数据来作例子非常有用. 先研究一下这个模块, 再研究通用函数

import numpy as np  

# random 生成 0 ~ 1 之间的随机数  
display(1 + np.random.random(3))  
np.random.random((2,3)) * 10  
array([1.33317465, 1.03829035, 1.19401465])





array([[2.13175522, 1.41162992, 9.67005144],
       [0.03480687, 4.63431381, 5.88380759]])
# 同上, 传参方式不一样  
display(np.random.rand(3))  
np.random.rand(1, 3, 2)  
array([0.60852454, 0.70296852, 0.31611002])





array([[[0.76136557, 0.14321424],
        [0.01322461, 0.89676522],
        [0.71400795, 0.00755323]]])
# 返回指定范围内的随机整数 [a,b) 包含 a 不包含 b, 不指定 b 则 [0,a)  
display(np.random.randint(3, size=3))  
np.random.randint(1, 4, (2, 3))  
array([0, 2, 0])





array([[2, 2, 1],
       [3, 2, 3]])
# 生成的随机数服从标准正态分布  
display(np.random.randn(3))  
np.random.randn(3, 2)  
array([-1.46427887,  0.87862733, -0.98698207])





array([[ 0.51350851, -0.67478546],
       [ 0.543379  ,  0.63665877],
       [-1.31200705, -0.30697352]])

类似还有拉普拉斯分布 laplace, 逻辑分布 logistic, 正态分布 normal 等, 可以设置分布的参数

np.random.logistic(5, 2, (2, 3))  
array([[2.40647744, 5.62327677, 5.8642342 ],
       [4.10741882, 7.65751053, 4.99483744]])
# 打乱原数组元素, 二维时只能打乱行的顺序  
a = np.arange(5)  
b = np.arange(9).reshape(3, 3)  
np.random.shuffle(a)  
np.random.shuffle(b)  
a, b  
(array([0, 2, 4, 1, 3]),
 array([[3, 4, 5],
        [6, 7, 8],
        [0, 1, 2]]))
# 从一个一维数组里随机选择指定数量的元素,   
# 或随机生成 0 到指定整数(不包含)的随机数  
# replace=True 元素可以重复选择(默认)  
display(np.random.choice(5, 5, replace=False))  
np.random.choice(a, (2, 3))  
array([4, 3, 1, 2, 0])





array([[3, 2, 2],
       [3, 0, 0]])

2, 创建数组

np.empty((2, 3))  
array([[2.40647744, 5.62327677, 5.8642342 ],
       [4.10741882, 7.65751053, 4.99483744]])
a = np.eye(3)  
a  
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
np.ones((2, 3))  
array([[1., 1., 1.],
       [1., 1., 1.]])
np.ones_like(a)  
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])
np.zeros((2, 3))  
array([[0., 0., 0.],
       [0., 0., 0.]])
np.full((2, 3), 3)  
array([[3, 3, 3],
       [3, 3, 3]])
np.array(list)  
array(<class 'list'>, dtype=object)
np.arange(3)  
array([0, 1, 2])
np.linspace(1, 9, 3)  
array([1., 5., 9.])
np.logspace(1, 3, 3)  
array([  10.,  100., 1000.])

五, 常用的通函数及 API

numpy 调用, 用来操作 ndarray 对象的函数

1, 修改数组形状

reshape 与 ndarray 对象的方法一样, 另有 resize 只能按行展开

a = np.random.choice(5, (2, 3))  
display(a)  
np.reshape(a,(1, 6), 'F')  
array([[0, 2, 2],
       [4, 1, 2]])





array([[0, 4, 2, 1, 2, 2]])
np.resize(a, (1, 6))  
array([[0, 2, 2, 4, 1, 2]])

ravel 展开为一维(ndarray 对象也有该方法)

np.ravel(a, 'F')  
array([0, 4, 2, 1, 2, 2])

2, 组合数组

concatenate, hstack, vstack 连接数组

# axis=0, 行方向连接(默认), axis=1, 列方向连接  
b = np.random.choice(6, (2, 3))  
np.concatenate((a, b), axis=1)  
array([[0, 2, 2, 2, 5, 5],
       [4, 1, 2, 2, 5, 2]])
np.hstack((a, b)) # 列方向连接  
array([[0, 2, 2, 2, 5, 5],
       [4, 1, 2, 2, 5, 2]])
np.vstack((a, b)) # 行方向连接  
array([[0, 2, 2],
       [4, 1, 2],
       [2, 5, 5],
       [2, 5, 2]])

stack 堆叠数组, 堆叠后维度增加 1

# axis=0, 行方向堆叠(默认), axis=1, 列方向堆叠  
np.stack((a[0], b[0])), np.stack((a[0], b[0]), axis=1)  
(array([[0, 2, 2],
        [2, 5, 5]]),
 array([[0, 2],
        [2, 5],
        [2, 5]]))

3, 拆分数组

split, hsplit, vsplit 将数组拆分, 返回为列表

np.split(a, 2), np.vsplit(a, 2), np.hsplit(a, 3)  
([array([[0, 2, 2]]), array([[4, 1, 2]])],
 [array([[0, 2, 2]]), array([[4, 1, 2]])],
 [array([[0],
         [4]]),
  array([[2],
         [1]]),
  array([[2],
         [2]])])

4, 添加, 删除元素

delete 删除指定索引的元素, 行或列

a, np.delete(a, 1) # 删除第 2 个元素  
(array([[0, 2, 2],
        [4, 1, 2]]),
 array([0, 2, 4, 1, 2]))
# 删除第 2 行, 或第 2 列  
np.delete(a, 1, axis=0), np.delete(a, 1, axis=1)  
(array([[0, 2, 2]]),
 array([[0, 2],
        [4, 2]]))

insert 在指定索引前插入元素, 行或列

np.insert(a, 1, 9)  
array([0, 9, 2, 2, 4, 1, 2])
np.insert(a, 1, 9, axis=0), np.insert(a, 1, [1, 2, 3], axis=0)  
(array([[0, 2, 2],
        [9, 9, 9],
        [4, 1, 2]]),
 array([[0, 2, 2],
        [1, 2, 3],
        [4, 1, 2]]))
np.insert(a, 1, [1, 3], axis=1)  
array([[0, 1, 2, 2],
       [4, 3, 1, 2]])

append 在数组末尾(或行,列末尾)加入元素, 行或列(维数必须相同)

np.append(a, 2)  
array([0, 2, 2, 4, 1, 2, 2])
np.append(a, [[2, 2, 2]], axis=0), np.append(a, [[2], [2]], axis=1)  
(array([[0, 2, 2],
        [4, 1, 2],
        [2, 2, 2]]),
 array([[0, 2, 2, 2],
        [4, 1, 2, 2]]))

unique 查找数组中的唯一值

a = np.random.choice(4, (2, 3))  
display(a)  
np.unique(a,return_index=True,  
             return_inverse=True,  
             return_counts=True, axis=None)  
array([[3, 0, 3],
       [1, 3, 1]])





(array([0, 1, 3]),
 array([1, 3, 0], dtype=int64),
 array([2, 0, 2, 1, 2, 1], dtype=int64),
 array([1, 2, 3], dtype=int64))

5, 重新排列元素

flip, fliplr, flipud 翻转数组

np.flip(a), np.flip(a, 0), np.flip(a, 1)  
(array([[1, 3, 1],
        [3, 0, 3]]),
 array([[1, 3, 1],
        [3, 0, 3]]),
 array([[3, 0, 3],
        [1, 3, 1]]))

sort 排序数组元素

np.sort(a)  
array([[0, 3, 3],
       [1, 1, 3]])

roll 滚动数组元素

np.roll(a, 1), np.roll(a, 1, axis=0), np.roll(a, 1, axis=1)  
(array([[1, 3, 0],
        [3, 1, 3]]),
 array([[1, 3, 1],
        [3, 0, 3]]),
 array([[3, 3, 0],
        [1, 1, 3]]))

6, 常用数学运算函数

import numpy as np  
# 固定随机种子  
np.random.seed(0)  
a = np.random.randint(1, 6, (3, 4))  
b = np.arange(12).reshape((3, 4))  
a, b  
(array([[5, 1, 4, 4],
        [4, 2, 4, 3],
        [5, 1, 1, 5]]),
 array([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]]))
np.power(b, a) # b**a  
array([[     0,      1,     16,     81],
       [   256,     25,   1296,    343],
       [ 32768,      9,     10, 161051]], dtype=int32)
np.divmod(b, a) # 商 和 余  
(array([[ 0,  1,  0,  0],
        [ 1,  2,  1,  2],
        [ 1,  9, 10,  2]], dtype=int32),
 array([[0, 0, 2, 3],
        [0, 1, 2, 1],
        [3, 0, 0, 1]], dtype=int32))
np.fabs(-a), np.abs(-a) # 取绝对值  
(array([[5., 1., 4., 4.],
        [4., 2., 4., 3.],
        [5., 1., 1., 5.]]),
 array([[5, 1, 4, 4],
        [4, 2, 4, 3],
        [5, 1, 1, 5]]))
c = np.random.rand(3, 4) * 10  
display(c)  
np.rint(c) # 舍入最接近的整数  
array([[3.83441519, 7.91725038, 5.2889492 , 5.68044561],
       [9.25596638, 0.71036058, 0.871293  , 0.20218397],
       [8.32619846, 7.78156751, 8.70012148, 9.78618342]])





array([[ 4.,  8.,  5.,  6.],
       [ 9.,  1.,  1.,  0.],
       [ 8.,  8.,  9., 10.]])
np.exp(a).round(1) # np.e ** a  
array([[148.4,   2.7,  54.6,  54.6],
       [ 54.6,   7.4,  54.6,  20.1],
       [148.4,   2.7,   2.7, 148.4]])
b = np.exp2(a) # 2**a  
a, b  
(array([[5, 1, 4, 4],
        [4, 2, 4, 3],
        [5, 1, 1, 5]]),
 array([[32.,  2., 16., 16.],
        [16.,  4., 16.,  8.],
        [32.,  2.,  2., 32.]]))
np.log(a)  
np.log2(a)  
np.log10(a)  
np.sqrt(a) # 开根号  
np.gcd(a, b.astype(int)) # 最大公约数  
np.lcm(a, b.astype(int)) # 最小公倍数  
array([[160,   2,  16,  16],
       [ 16,   4,  16,  24],
       [160,   2,   2, 160]])
np.sin(a)  
np.cos(a)  
np.tan(a)  
array([[-3.38051501,  1.55740772,  1.15782128,  1.15782128],
       [ 1.15782128, -2.18503986,  1.15782128, -0.14254654],
       [-3.38051501,  1.55740772,  1.55740772, -3.38051501]])
np.greater(a, b) # a > b  
np.less(a, b) # a < b  
a != b # np.not_equal(a, b)  
(a > 2) | ~(b < 5) # np.logical_or(a>2, ~(b<5))  
array([[ True, False,  True,  True],
       [ True, False,  True,  True],
       [ True, False, False,  True]])
# 两者取其大, 同 np.fmax(a*5, b) 对应还有 minimum, fmin  
np.maximum(a*5, b)   
array([[32.,  5., 20., 20.],
       [20., 10., 20., 15.],
       [32.,  5.,  5., 32.]])
np.isinf(a) # 判断是否正负无穷大  
np.isnan(a) # 判断是否 nan  
array([[False, False, False, False],
       [False, False, False, False],
       [False, False, False, False]])
np.modf(c) # 分别返回小数和整数部分  
(array([[0.83441519, 0.91725038, 0.2889492 , 0.68044561],
        [0.25596638, 0.71036058, 0.871293  , 0.20218397],
        [0.32619846, 0.78156751, 0.70012148, 0.78618342]]),
 array([[3., 7., 5., 5.],
        [9., 0., 0., 0.],
        [8., 7., 8., 9.]]))
np.fmod(b, a) # 返回余数  
array([[2., 0., 0., 0.],
       [0., 0., 0., 2.],
       [2., 0., 0., 2.]])
c = np.random.rand(3, 4) * 10  
display(c)  
np.floor(c) # 向下取整  
np.ceil(c) # 向上取整  
array([[7.99158564, 4.61479362, 7.80529176, 1.18274426],
       [6.39921021, 1.43353287, 9.44668917, 5.21848322],
       [4.1466194 , 2.64555612, 7.74233689, 4.56150332]])





array([[ 8.,  5.,  8.,  2.],
       [ 7.,  2., 10.,  6.],
       [ 5.,  3.,  8.,  5.]])

7, 字符串操作

字符串的操作函数, 和 python 的操作函数相似, 只是 numpy 作用到整个数组上

a = np.array([['a', 'b', 'c'], [20, 19, 18]])  
np.char.add(a, a)  
array([['aa', 'bb', 'cc'],
       ['2020', '1919', '1818']], dtype='<U22')
np.char.multiply(a, 3)  
array([['aaa', 'bbb', 'ccc'],
       ['202020', '191919', '181818']], dtype='<U33')
# 将每一个制表符替换成指定个数的空格  
b = np.array('\ta\t\tbc\td')  
np.char.expandtabs(b, 1)  
array(' a  bc d', dtype='<U8')
np.char.replace(a, '1', '2') # 替换  
array([['a', 'b', 'c'],
       ['20', '29', '28']], dtype='<U2')
np.char.title(a)  
array([['A', 'B', 'C'],
       ['20', '19', '18']], dtype='<U11')
b = np.char.zfill(a, 4)  
b  
array([['000a', '000b', '000c'],
       ['0020', '0019', '0018']], dtype='<U4')
np.char.count(b, '0') # 0 出现的次数  
array([[3, 3, 3],
       [3, 2, 2]])
np.char.str_len(a) # 字符串长度  
array([[1, 1, 1],
       [2, 2, 2]])

8, 索引与迭代

a = np.random.choice(4, (3, 4))  
display(a)  
np.nonzero(a) # 非 0 索引  
array([[2, 0, 0, 0],
       [1, 1, 2, 0],
       [0, 1, 3, 0]])





(array([0, 1, 1, 1, 2, 2], dtype=int64),
 array([0, 0, 1, 2, 1, 2], dtype=int64))
# 返回指定条件的元素的索引, 并可进行替换  
# 不设条件, 和 nonzero 一样  
np.where(a>0)  
(array([0, 1, 1, 1, 2, 2], dtype=int64),
 array([0, 0, 1, 2, 1, 2], dtype=int64))
# 大于 0 都换成 a, 否则都换成 b  
np.where(a>0, 'a', 'b')  
array([['a', 'b', 'b', 'b'],
       ['a', 'a', 'a', 'b'],
       ['b', 'a', 'a', 'b']], dtype='<U1')
np.nditer(a) # 将数组变成一个高效的迭代器  
<numpy.nditer at 0x2b410944d50>

9, 统计运算函数

# 下述与 ndarray 对象直接调用的方法一样  
a = np.random.rand(3, 4) * 5  
np.all(a)  
np.any(a)  
np.max(a)  
np.sum(a)  
np.mean(a)  
np.cumsum(a)  
np.var(a)  
np.std(a)  
np.clip(a, 1, 3)  
np.around(a, 2) # ndarray 对象的方法是 round  
# 等等  
array([[3.41, 1.8 , 2.19, 3.49],
       [0.3 , 3.33, 3.35, 1.05],
       [0.64, 1.58, 1.82, 2.85]])

任何数与 nan 计算都是 nan, 可以用相应的函数排除 nan

b = np.array([1, np.nan, 3, 4])  
np.sum(b), np.nansum(b)  
(nan, 8.0)
np.nancumsum(b)  
array([1., 1., 4., 8.])
jupyter附件