python-- numpy学习总结

目录

一、Numpy常见用法

1. 创建数组

2. 索引与切片

3. dtype

4. 一般方法

4.1 arange

4.2 zeros

4.3 ones

4.4 eye

4.5 rand

4.6 randint

4.7 max min argmax argmin

二、NumPy进阶用法

1. reshape

2. 合并与分割

2.1 concatenate

2.2 array_split

3. 搜索与筛选

3.1 搜索

3.2 筛选

4. 排序

5.三角函数

6. 随机

6.1 随机概率

6.2 随机排列

6.3 随机分布


一、Numpy常见用法

1. 创建数组

1)使用np.array创建

import numpy as np
arr = np.array([1, 2, 3, 4, 5])

arr的输出为array([1, 2, 3, 4, 5])

我们输入以下代码创建二维数组:

my_matrix = [[1,2,3],[4,5,6],[7,8,9]]
mtrx= np.array(my_matrix)

mtrx的输出如下:

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

2)创建特殊数组

#生成特殊数组
a1 = np.zeros((3,5)) #生成全0数组
print(a1)
b1 = np.ones((2,3))
print(b1)

3)使用arange()生成数组

# 利用arange()生成数组
c1 = np.arange(10,20,2)
print(c1)

2. 索引与切片

1)索引一维数组与二位数组如下:

print('arr[0]=',arr[0],'mtrx[1,1]=',mtrx[1,1])

输出 arr[0]= 1 mtrx[1,1]= 5

对数组切片:

arr[:3]

输出结果为 array([1, 2, 3])

2)倒数切片:

arr[-3:-1]

输出 array([3, 4])

加入步长(step),步长决定了切片间隔:

arr[1:4:2]

输出 array([2, 4])

3)二维数组切片:

mtrx[0:2, 0:2]

输出,代码意义为取第1、2行,第1、2列:

array([[1, 2],
       [4, 5]])

3. dtype

NumPy的dtpe有如下几种数据类型:

  • i - integer

  • b - boolean

  • u - unsigned integer

  • f - float

  • c - complex float

  • m - timedelta

  • M - datetime

  • O - object

  • S - string

  • U - unicode string

  • V - fixed chunk of memory for other type ( void )

import numpy as np
arr1 = np.array([1, 2, 3, 4])
arr2 = np.array(['apple', 'banana', 'cherry'])
print('arr1.dtype=',arr1.dtype,'arr2.dtype=',arr2.dtype)

输出为 arr1.dtype= int32 arr2.dtype= <U6。arr1数据类型为int32,arr2的<U6表示不超过6位Unicode字符串。

我们可以指定dtype类型。

arr = np.array(['1', '2', '3'], dtype='f')

输出结果为 array([1., 2., 3.], dtype=float32),其中1.表示1.0,可以看到dtype被设置为float32数据类型。

4. 一般方法

4.1 arange

np.arange(0,101,2)输出结果如下,该命令表示,在[0,101)区间内均匀地生成数据,间隔步长为2。

array([  0,   2,   4,   6,   8,  10,  12,  14,  16,  18,  20,  22,  24,
        26,  28,  30,  32,  34,  36,  38,  40,  42,  44,  46,  48,  50,
        52,  54,  56,  58,  60,  62,  64,  66,  68,  70,  72,  74,  76,
        78,  80,  82,  84,  86,  88,  90,  92,  94,  96,  98, 100])

4.2 zeros

np.zeros((2,5))输出结果如下,该命令表示,输出2行5列全为0的矩阵(二维数组)。

array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])

4.3 ones

np.ones((4,4))输出结果如下,该命令表示,输出4行4列全为1的矩阵。

array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])

4.4 eye

np.eye(5)输出结果如下,该命令表示,输出对角线为1其余全为0的5行5列方阵。

方阵为行列相同的矩阵。也就是我们数学中的单位矩阵

array([[1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.]])

4.5 rand

np.random.rand(5,2) 命令生成5行2列的随机数。

array([[0.67227856, 0.4880784 ],
       [0.82549517, 0.03144639],
       [0.80804996, 0.56561742],
       [0.2976225 , 0.04669572],
       [0.9906274 , 0.00682573]])

如果想保证随机出与本例一样的随机数,可使用与本例相同的随机种子。通过np.random.seed方法设置。

np.random.seed(99)
np.random.rand(5,2)

4.6 randint

np.random.randint(0,101,(4,5))输出结果如下,该命令表示,在[0,101)区间内随机选取整数生成4行5列的数组。

array([[ 1, 35, 57, 40, 73],
       [82, 68, 69, 52,  1],
       [23, 35, 55, 65, 48],
       [93, 59, 87,  2, 64]])

4.7 max min argmax argmin

我们先随机生成一组数:

np.random.seed(99)
ranarr = np.random.randint(0,101,10)
ranarr

输出:

array([ 1, 35, 57, 40, 73, 82, 68, 69, 52,  1])

查看最大最小值分别为:使用

print('ranarr.max()=',ranarr.max(),'ranarr.min()=',ranarr.min())

输出结果为ranarr.max()= 82 ranarr.min()= 1
其中最大值和最小值的索引位置分别为:

print('ranarr.argmax()=',ranarr.argmax(),'ranarr.argmin()=',ranarr.argmin())

输出:ranarr.argmax()= 5 ranarr.argmin()= 0

注意,当出现多个最大最小值时,取前面的索引位置。

总结如下:

.min() : 返回最小值

.max():返回最大值
.argmin():返回最小值所在的索引
.argmax():返回最大值所在的索引

print(ranarr.argmin())
print(ranarr.argmax())
print(ranarr.max())
print(ranarr.min())

二、NumPy进阶用法

1. reshape

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
newarr = arr.reshape(4, 3)

其中,arr为一维数组,newarr为二位数组,其中行为4,列为3

reshape 用来塑造数组,shape用来反映数组维度

print('arr.shape=',arr.shape,'newarr.shape=',newarr.shape)

输出 arr.shape= (12,) newarr.shape= (4, 3)

newarr的输出结果如下:

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

2. 合并与分割

2.1 concatenate

一维数组合并: 使用np.concatenate((arr1,arr2))  注意:两层括号

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr = np.concatenate((arr1, arr2))
arr

输出: array([1, 2, 3, 4, 5, 6])

二维数组合并:

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
arr = np.concatenate((arr1, arr2))
arr

输出为:

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

我们添加参数axis=1:

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
arr = np.concatenate((arr1, arr2), axis=1)
arr

输出为:

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

我们把鼠标移到 concatenate,按快捷键Shift+Tab查看方法说明。

可以看到concatenate方法沿着现有的轴进行合并操作,默认axis=0。

当我们设置axis=1后,合并操作沿着列进行。

总结即

print("axis=0")
print(arr)
arr2 = np.concatenate((arr1,arr2),axis = 1)
print("axis=1")
print(arr2)

运行结果为:

2.2 array_split

分割数组:

arr = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12]])
newarr = np.array_split(arr, 3)
newarr

newarr的值为:

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

3. 搜索与筛选

3.1 搜索

NumPy可通过where方法查找满足条件的数组索引。

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
x = np.where(arr%2 == 0)
x

输出:

(array([1, 3, 5, 7], dtype=int64),)

3.2 筛选

我们看看下面的代码:

bool_arr = arr > 4
arr[bool_arr]

输出:array([5, 6, 7, 8])这回我们返回的是数组中的值,而非索引。我们看看bool_arr的内容究竟是什么。 bool_arr的输出为:

array([False, False, False, False,  True,  True,  True,  True])

所以我们可以用以下命令代替以上筛选。

arr[arr > 4]

4. 排序

sort方法可对ndarry数组进行排序。

arr = np.array(['banana', 'cherry', 'apple'])
np.sort(arr)

输出排序后的结果:array(['apple', 'banana', 'cherry'], dtype='<U6')

针对二维数组,sort方法对每一行单独排序。

arr = np.array([[3, 2, 4], [5, 0, 1]])
np.sort(arr)

输出结果:

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

5.三角函数

直接使用np.sin()

# c1 = np.arange(10,20,2)
# print(c1)
#
# #使用数学中的三角函数
# d1 = np.sin(c1)
# print(d1)

6. 随机

6.1 随机概率

如果我们想完成如下需求该如何处理?

生成包含100个值的一维数组,其中每个值必须为3、5、7或9。将该值为3的概率设置为0.1。将该值为5的概率设置为0.3。将该值为7的概率设置为0.6。将该值为9的概率设置为0。

我们用如下命令解决:

random.choice([3, 5, 7, 9], p=[0.1, 0.3, 0.6, 0.0], size=(100))

输出结果:

array([7, 5, 7, 7, 7, 7, 5, 7, 5, 7, 7, 5, 5, 7, 7, 5, 3, 5, 7, 7, 7, 7,
       7, 7, 7, 7, 7, 7, 5, 3, 7, 5, 7, 5, 7, 3, 7, 7, 3, 7, 7, 7, 7, 3,
       5, 7, 7, 5, 7, 7, 5, 3, 5, 7, 7, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 5,
       7, 7, 7, 7, 7, 5, 7, 7, 7, 7, 3, 7, 7, 5, 7, 5, 7, 5, 7, 7, 5, 7,
       7, 7, 7, 7, 7, 3, 5, 5, 7, 5, 7, 5])

6.2 随机排列

 permutation根据原有数组生成新的随机排列。

np.random.seed(99)
arr = np.array([1, 2, 3, 4, 5])
new_arr = np.random.permutation(arr)
new_arr

输出为:array([3, 1, 5, 4, 2])。原数组arr不变。

shuffle改变原有数组为随机排列。shuffle在英文中有洗牌的意思。

np.random.seed(99)
arr = np.array([1, 2, 3, 4, 5])
np.random.shuffle(arr)
arr

输出为:array([3, 1, 5, 4, 2])。原数组arr改变。

6.3 随机分布

使用np.random.normal方法生成符合正态分布的随机数。

x = np.random.normal(loc=1, scale=2, size=(2, 3))
x

输出结果为:

array([[ 0.14998973,  3.22564777,  1.48094109],
       [ 2.252752  , -1.64038195,  2.8590667 ]])

如果我们想查看x的随机分布,需安装seaborn绘制图像。使用pip安装:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple seaborn

import matplotlib.pyplot as plt
import seaborn as sns
sns.distplot(x, hist=False)
plt.show()

图片

二项分布

使用np.random.binomial方法生成符合二项分布的随机数。

x = np.random.binomial(n=10, p=0.5, size=10)
x

输出结果为: array([8, 6, 6, 2, 5, 5, 5, 5, 3, 4])

绘制图像:

import matplotlib.pyplot as plt
import seaborn as sns
sns.distplot(x, hist=True, kde=False)
plt.show()

图片

多项式分布

多项式分布是二项分布的一般表示。使用np.random.multinomial方法生成符合多项式分布的随机数。

x = np.random.multinomial(n=6, pvals=[1/6, 1/6, 1/6, 1/6, 1/6, 1/6])
x

上面代码,我们可以简单理解为投掷骰子。n=6为骰子的面,pvals表示每一面的概率为1/6。

 

猜你喜欢

转载自blog.csdn.net/yezonghui/article/details/113752590