numpy中运算
import numpy as np
nd = np.arange(1,5).reshape((2, 2))
nd
-
输出
array([[1, 2],
[3, 4]])
# tile循环, 依赖是行, 把每行中的数据循环N次
np.tile(nd, 3)
-
输出
array([[1, 2, 1, 2, 1, 2],
[3, 4, 3, 4, 3, 4]])
# repeat循环会先降维,再进行循环
np.repeat(nd, 3)
-
输出
array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4])
五、ndarray的矩阵操作
1. 基本矩阵操作
- 算术运算符:
- 加减乘除
nd1 = np.random.randint(0, 10, size=(5, 4))
nd1
-
输出
array([[4, 3, 3, 1],
[9, 3, 6, 4],
[8, 3, 5, 6],
[0, 6, 2, 2],
[5, 9, 9, 7]])
# 矩阵加上单个数值=每个基本元素都加上该值
nd1 + 3
-
输出
array([[ 7, 6, 6, 4],
[12, 6, 9, 7],
[11, 6, 8, 9],
[ 3, 9, 5, 5],
[ 8, 12, 12, 10]])
np.add() 求和
不对原来的数组产生影响
# 在jupyter中,如果某个函数对原来数组产生影响的话,不会直接输出
np.add(nd1,10)
-
输出
array([[14, 13, 13, 11],
[19, 13, 16, 14],
[18, 13, 15, 16],
[10, 16, 12, 12],
[15, 19, 19, 17]])乘积 np.multiply() 乘积
不对原来的结果产生影响
np.multiply(nd1, 10)
-
输出
array([[40, 30, 30, 10],
[90, 30, 60, 40],
[80, 30, 50, 60],
[ 0, 60, 20, 20],
[50, 90, 90, 70]])矩阵的乘积 np.dot()
nd2 = np.random.randint(0, 10, size=(4, 5))
nd2
-
输出
array([[6, 8, 2, 8, 3],
[4, 2, 2, 0, 5],
[6, 0, 0, 8, 9],
[4, 3, 0, 0, 3]])
np.dot(nd1, 10)
-
输出
array([[40, 30, 30, 10],
[90, 30, 60, 40],
[80, 30, 50, 60],
[ 0, 60, 20, 20],
[50, 90, 90, 70]])
np.dot(nd1, nd2)
-
输出
array([[ 58, 41, 14, 56, 57],
[118, 90, 24, 120, 108],
[114, 88, 22, 104, 102],
[ 44, 18, 12, 16, 54],
[148, 79, 28, 112, 162]])
三维乘以一维
nd3 = np.random.randint(0, 10, size=(5, 4, 3))
nd4 = np.random.randint(0, 10, size=3)
nd3
-
输出
array([[[6, 2, 8],
[3, 9, 7],
[2, 8, 1],
[2, 4, 9]],[[6, 7, 3], [2, 3, 6], [9, 7, 2], [2, 7, 7]], [[2, 7, 5], [0, 3, 6], [2, 5, 0], [1, 4, 7]], [[6, 3, 0], [9, 3, 8], [0, 9, 3], [4, 9, 6]], [[0, 0, 6], [5, 6, 6], [7, 9, 6], [5, 8, 6]]])
nd4
-
输出
array([8, 8, 8])
np.dot(nd3, nd4)
-
输出
array([[128, 152, 88, 120],
[128, 88, 144, 128],
[112, 72, 56, 96],
[ 72, 160, 96, 152],
[ 48, 136, 176, 152]])
三维乘以二维
nd3 = np.random.randint(0, 10, size=(5, 4, 3))
nd3
-
输出
array([[[6, 2, 0],
[7, 0, 3],
[1, 3, 2],
[0, 5, 0]],[[5, 1, 8], [2, 2, 0], [4, 0, 4], [2, 4, 6]], [[3, 0, 5], [4, 4, 0], [6, 3, 0], [3, 3, 4]], [[5, 6, 3], [4, 5, 2], [8, 1, 5], [6, 4, 3]], [[4, 7, 9], [3, 6, 3], [5, 7, 6], [5, 3, 7]]])
nd4 = np.random.randint(0, 10, size=(3, 1))
nd4
-
输出
array([[0],
[8],
[7]])
np.dot(nd3, nd4)
-
输出
array([[[ 16],
[ 21],
[ 38],
[ 40]],[[ 64], [ 16], [ 28], [ 74]], [[ 35], [ 32], [ 24], [ 52]], [[ 69], [ 54], [ 43], [ 53]], [[119], [ 69], [ 98], [ 73]]])
2. 广播机制
【重要】ndarray广播机制的两条规则
规则一:为缺失的维度补1
规则二:假定缺失元素用已有值填充
例1: m = np.ones((2, 3)) a = np.arange(3) 求M+a
nd1 = np.ones((2, 3))
nd1
-
输出
array([[1., 1., 1.],
[1., 1., 1.]])
nd2 = np.arange(3)
nd2
-
输出
array([0, 1, 2])
nd1 + nd2
-
输出
array([[1., 2., 3.],
[1., 2., 3.]])
np.add(nd1, nd2)
-
输出
array([[1., 2., 3.],
[1., 2., 3.]])
六、ndarray的排序
小测验: 使用以上所学numpy的知识,对一个ndarray对象进行选择排序。
代码越短越好
nd = np.random.randint(0, 150, size=10)
nd
-
输出
array([16, 13, 64, 94, 11, 4, 8, 18, 53, 82])
for i in range(nd.size):
for j in range(nd.size - 1):
if nd[i]<nd[j]:
nd[i], nd[j]= nd[j], nd[i]
nd1 = np.random.randint(0, 150, size=10)
# 用一层循环
# argmin, 封装成函数
def sort_nd(nd):
for i in range(nd.size):
min_index = nd[i:].argmin() + i
nd[i], nd[min_index] = nd[min_index], nd[i]
sort_nd(nd1)
nd1
-
输出
array([ 3, 5, 15, 16, 20, 31, 97, 117, 121, 124])
1. '快速’排序
np.sort()与ndarray.sort()都可以,但有区别:
- np.sort()不改变输入
- ndarray.sort()本地处理,不占用空间,但改变输入
nd2 = np.random.randint(0, 10, size=10)
nd2
-
输出
array([0, 7, 6, 4, 3, 6, 5, 4, 8, 2])
np.sort(nd2)
-
输出
array([0, 2, 3, 4, 4, 5, 6, 6, 7, 8])
# 对原数组产生影响的
nd2.sort()
2. 部分排序
np.partition(a,k)
有的时候我们不是对全部数据感兴趣,我们可能只对最小或最大的一部分感兴趣。
- 当k为正时,我们想要得到最小的k个数
- 当k为负时,我们想要得到最大的k个数
```python
nd3 = np.random.randint(0, 10000, size=100)
nd3
-
输出
array([ 732, 4152, 6395, 2513, 8923, 2514, 5521, 2771, 6992, 4554, 3441,
6460, 4370, 6993, 5186, 2202, 9520, 7577, 5361, 3052, 6414, 6556,
4464, 8971, 9111, 3510, 6266, 9991, 5446, 1311, 4478, 3794, 6912,
7155, 562, 1171, 6855, 4052, 7125, 1780, 2284, 94, 6662, 293,
1919, 1984, 9865, 1762, 7369, 8426, 6908, 5491, 8393, 6186, 6700,
2388, 5456, 8942, 5620, 3706, 5725, 2838, 3107, 6969, 3391, 7052,
6796, 3079, 3619, 2407, 7528, 345, 3444, 5699, 9435, 6056, 9739,
3832, 6933, 1365, 1004, 6159, 3489, 6884, 6192, 8333, 7274, 8907,
8613, 5055, 3885, 6131, 2329, 2686, 7628, 6138, 3970, 2815, 8916,
1910])
np.partition(nd3, -5)[-5<