import numpy as np
np.random.seed(0) # 设置随机数种子
np_array = np.random.randint(10, size=(3, 4, 5), dtype='int') # 三维数组
np_array .ndim
np_array .shape
np_array .size
np_array [start:stop:step]
np_array .copy
import copy
copy.deepcopy(np_array)
np.arange(1, 10).reshape((3, 3))
np_array [np.newaxis, :] # 获得行向量或列向量
x = np.array([1, 2, 3])
y = np.array([3, 2, 1])
np.concatenate([x, y])
np.concatenate([x, y], axis=1)
# 垂直栈数组
np.vstack([x, y])
# 水平栈数组
np.hstack([x, y])
与之类似, np.dstack 将沿着第三个维度拼接数组
分裂可以通过 np.split、 np.hsplit 和 np.vsplit 函数来实现
x = [1, 2, 3, 99, 99, 3, 2, 1]
x1, x2, x3 = np.split(x, [3, 5])
print(x1, x2, x3)
grid = np.arange(16).reshape((4, 4))
upper, lower = np.vsplit(grid, [2])
numpy数组计算
x // 2 # 整除
x % 2 # 取余
// np.floor_divide 地板除法运算(floor division,即 3 // 2 = 1)
** np.power 指数运算(即 2 ** 3 = 8)
% np.mod 模 / 余数(即 9 % 4 = 1)
x = [1, 2, 3]
print("x =", x)
print("e^x =", np.exp(x))
print("2^x =", np.exp2(x))
print("3^x =", np.power(3, x))
x = [1, 2, 4, 10]
print("x =", x)
print("ln(x) =", np.log(x))
print("log2(x) =", np.log2(x))
print("log10(x) =", np.log10(x))
y = np.zeros(10)
np.power(2, x, out=y[::2])
print(y)
如果这里写的是 y[::2] = 2 ** x,那么结果将是创建一个临时数组,该数组存放的是2 ** x 的结果,并且接下来会将这些值复制到 y 数组中。对于上述例子中比较小的计算量来说,这两种方式的差别并不大。但是对于较大的数组,通过慎重使用 out 参数将能够有效节约内存。
np.sum、 np.prod、 np.cumsum、np.cumprod
x = np.arange(1, 6)
np.add.reduce(x) # 重复计算,不保留中间结果
np.add.accumulate(x) #重复计算,并保留中间结果
np.multiply.outer(x, x) # 外积
M.min(axis=0)
M.max(axis=1)
如果需要统计布尔数组中 True 记录的个数,可以使用 np.count_nonzero 函数
# 有没有值大于8?
np.any(x > 8)
# 是否所有值都小于10?
np.all(x < 10)
Python 的逐位逻辑
运算符(bitwise logic operator) &、 |、 ^ 和 ~ 来实现。
and 和 or 判断整个对象是真或假,而 & 和 | 是指每个对象中的比特位。
x = np.zeros(10)
i = [2, 3, 3, 4, 4, 4]
x[i] += 1
x = np.zeros(10)
np.add.at(x, i, 1)
NumPy中的快速排序: np.sort和np.argsort
对X的每一列排序
np.sort(X, axis=0)
x = np.array([7, 2, 3, 1, 6, 5, 4])
np.partition(x, 3)
np.partition(X, 2, axis=1)