目录
基本概念
基本属性
创建
使用
方法
操作
运算
基本运算
方法运算
线性代数运算
ufunc函数
基本概念
维度(dimensions)称为轴 (axes),轴的个数称为秩(rank)。
基本属性
- ndarray.ndim(秩)
- ndarray.shape(维度)
- ndarray.size(元素总个数)
- ndarray.dtype(元素类型)
- ndarray.itemsize(元素字节大小)
创建
ndarray的创建可以使用多种创建函数,如下所示,只展示几种常见的创建方法,代码如下所示:
arange | array | copy | empty | empty_like | eye | fromfile | fromfunction | identity |
---|---|---|---|---|---|---|---|---|
linspace | logspace | mgrid | ogrid | ones | random | ones_like | zeros | zeros_like |
import numpy as np
g = np.array([1, 2, 3]) # 用array方法创建了一个一维数组
print(g)
h = np.array([(1, 2, 3), (4, 5, 6)]) # 用array方法创建了一个二维数组
print(h)
print(h.ndim) # 输出轴的个数(秩)
print(h.shape) # 输出维度
print(h.size) # 输出元素总个数
a = np.arange(1, 5, 0.5) # 同range类似,步长为0.5,从1到5(不包过5)
print(a)
b = np.random.random((2, 2)) # 随机产生0~1的数字,生成一个维度为(2,2)的数组
print(b)
c = np.linspace(1, 2, 10, endpoint=False) # 生成1~2之间的数,不包括最后一位
print(c)
d = np.ones([2, 3]) # 生成维度为(2,3)的全为1的数组
print(d)
e = np.zeros((2, 2)) # 生成维度为(2,2)的全为0的数组
print(e)
f = np.fromfunction(lambda i, j: (i 1) * (j 1), (9, 9)) # 以lambda函数生成一个维度为(9,9)的数组
print(f)
运行结果如下所示:
[1 2 3] [[1 2 3] [4 5 6]] 2 (2, 3) 6 [1. 1.5 2. 2.5 3. 3.5 4. 4.5] [[0.24045529 0.37604814] [0.95796953 0.89254894]] [1. 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9] [[1. 1. 1.] [1. 1. 1.]] [[0. 0.] [0. 0.]] [[ 1. 2. 3. 4. 5. 6. 7. 8. 9.] [ 2. 4. 6. 8. 10. 12. 14. 16. 18.] [ 3. 6. 9. 12. 15. 18. 21. 24. 27.] [ 4. 8. 12. 16. 20. 24. 28. 32. 36.] [ 5. 10. 15. 20. 25. 30. 35. 40. 45.] [ 6. 12. 18. 24. 30. 36. 42. 48. 54.] [ 7. 14. 21. 28. 35. 42. 49. 56. 63.] [ 8. 16. 24. 32. 40. 48. 56. 64. 72.] [ 9. 18. 27. 36. 45. 54. 63. 72. 81.]]
使用
方法
对数组进行操作,代码如下:
代码语言:javascript复制import numpy as np
a = np.arange(1, 5) # 生成1~4
print(a)
print(np.power(a, 2).sum()) # 平方和相加
print(np.add(a, np.arange(4))) # 两个数组相加
运行结果如下所示:
[1 2 3 4] 30 [1 3 5 7]
改变数组,代码如下所示:
代码语言:javascript复制import numpy as np
a = np.array([(1, 2, 3), (4, 5, 6)])
print(a.shape)
b = a.reshape(3, 2) # 复制一个(3,2)的数组,本身未改变
print(b)
print(b.shape)
print(a)
a.resize(3, 2) # 将数组本身改变为(3,2)的数组中
print(a)
d = np.array([1, 3, 7])
e = np.array([3, 5, 8])
print(np.vstack((d, e))) # 纵向拼接
print(np.hstack((d, e))) # 横向拼接
运行结果如下所示:
(2, 3) [[1 2] [3 4] [5 6]] (3, 2) [[1 2 3] [4 5 6]] [[1 2] [3 4] [5 6]] [[1 3 7] [3 5 8]] [1 3 7 3 5 8]
同样的,改变数组,代码如下:
代码语言:javascript复制import numpy as np
x = np.arange(1, 17).reshape(4, 4) # 生成一个从1~16,(4,4)的数组
print(x)
print(x.reshape(2, -1)) # 定义成两行随机列
print(x.reshape(-1, 1)) # 定义成一列随机行
运行结果如下所示:
定义数组 [[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12] [13 14 15 16]] 两行随机列 [[ 1 2 3 4 5 6 7 8] [ 9 10 11 12 13 14 15 16]] 一列随机行 [[ 1] [ 2] [ 3] [ 4] [ 5] [ 6] [ 7] [ 8] [ 9] [10] [11] [12] [13] [14] [15] [16]]
操作
ndarry中可以通过一些运算符来操作数组,代码如下所示:
代码语言:javascript复制import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
print(a)
print(a[0])
print(a[:, [0, 2]]) # 第一列和第三列
print(a[::2]) # 奇数行
print(a[:, ::2]) # 奇数列
print(a[::-1]) # 交换行
print(a[:, ::-1]) #交换列
运行结果如下所示:
本身 [[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]] 第一行 [1 2 3] 第一列 [[ 1 3] [ 4 6] [ 7 9] [10 12]] 奇数行 [[1 2 3] [7 8 9]] 奇数列 [[ 1 3] [ 4 6] [ 7 9] [10 12]] 交换行 [[10 11 12] [ 7 8 9] [ 4 5 6] [ 1 2 3]] 交换列 [[ 3 2 1] [ 6 5 4] [ 9 8 7] [12 11 10]]
运算
ndarray中可以使用许多运算函数,并且有许多的运算符,可以便捷的对数组进行操作,代码如下所示:
基本运算
代码语言:javascript复制import numpy as np
aArray = np.array([(5, 4, 5), (5, 3, 4)])
bArray = np.array([(2, 3, 2), (2, 4, 2)])
cArray = aArray * bArray # 数组值相乘
print(cArray)
aArray = bArray # 数组值相加
print(aArray)
a = np.array([1, 2, 3])
b = np.array([[1, 2, 3], [4, 5, 6]])
print(a b) # 广播性质,自动拓展成相同维度
print(a 2) # 同上
运行结果如下所示:
值相乘 [[10 12 10] [10 12 8]] 值相加 [[7 7 7] [7 7 6]] 广播性质,相加 [[2 4 6] [5 7 9]] 广播性质,相加 [3 4 5]
方法运算
代码语言:javascript复制import numpy as np
aArray = np.array([(1, 2, 3), (4, 5, 6)])
print(aArray.sum())
print(aArray.sum(axis=0)) # 列求和
print(aArray.sum(axis=1)) # 行求和
print(aArray.min()) # 返回最小值
print(aArray.argmax()) # 返回最大值的索引
print(aArray.mean()) # 返回平均值
print(aArray.var()) # 返回方差
print(aArray.std()) # 返回标准差
运行结果如下所示:
21 [5 7 9] [ 6 15] 1 5 3.5 2.9166666666666665 1.707825127659933
线性代数运算
代码语言:javascript复制import numpy as np
x = np.array([[1, 2], [3, 4]])
r1 = np.linalg.det(x) # 行列式
print(r1)
r2 = np.linalg.inv(x) # 逆矩阵
print(r2)
r3 = np.dot(x, x) # 矩阵内积
print(r3)
运行结果如下所示:
行列式 -2.0000000000000004 逆矩阵 [[-2. 1. ] [ 1.5 -0.5]] 矩阵内积 [[ 7 10] [15 22]]
注:与scipy的线性运算很像,代码如下:
代码语言:javascript复制import numpy as np
from scipy import linalg
arr = np.array([[1, 2], [3, 4]])
print(linalg.det(arr)) # 行列式
运行结果如下所示:
-2.0
ufunc函数
ufunc(universal function)是一种能对数组的每个元素进行操作的函数。NumPy内置的许多ufunc函数都是在C语言级别实现的,计算速度非常快。
记得有这个东西就行,好像每快多少,也可能是我用错了