数据分析必备:Numpy基础学习教程!!!

什么是Numpy?

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。
NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合 C/C++/Fortran 代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

关于Numpy的运行速度为什么快?

因为Numpy的最底层是用C语言来写的,我们都知道C语言的运行速度是十分的强大,所以我们在用Numpy进行矩阵的运算或者合并等操作时,运行速度比用Python创建矩阵和数组然后计算的速度要快得多。

Numpy的一些基本操作

一、用Numpy创建第一个数组

numpy.arrary(shape, dtype = float)

参数说明:

  • shape–创建的数组
  • dtype–数组的类型
import numpy as np

a = np.array([2, 23, 4], dtype=np.int)  # 创建一个整型的数组
print(a)


[ 2 23  4]
import numpy as np

a = np.array([2, 23, 4], dtype=np.float)  # 创建一个整型的数组
print(a)


[ 2. 23.  4.]
import numpy as np

a = np.array([2, 23, 4], dtype=np.complex)  # 创建一个整型的数组
print(a)


[ 2.+0.j 23.+0.j  4.+0.j]

二、Numpy的数组的一些基本属性

  • ndarray.ndim - 数组的轴(维度)的个数。在Python世界中,维度的数量被称为rank。
  • ndarray.shape - 数组的维度。这是一个整数的元组,表示每个维度中数组的大小。对于有 n 行和 m 列的矩阵,shape 将是 (n,m)。因此,shape 元组的长度就是rank或维度的个数 ndim。
  • ndarray.size - 数组元素的总数。这等于 shape 的元素的乘积。
  • ndarray.dtype - 一个描述数组中元素类型的对象。可以使用标准的Python类型创建或指定dtype。另外NumPy提供它自己的类型。例如numpy.int32、numpy.int16和numpy.float64。
  • ndarray.itemsize - 数组中每个元素的字节大小。例如,元素为 float64 类型的数组的 itemsize 为8(=64/8),而 complex32 类型的数组的 itemsize 为4(=32/8)。它等于 ndarray.dtype.itemsize 。
  • ndarray.data - 该缓冲区包含数组的实际元素。通常,我们不需要使用此属性,因为我们将使用索引访问数组中的元素。

三、Numpy数组的一些简单操作

  • zeros–表示数组中的元素都是0
  • ones–表示数组中的元素都是1
  • empty–表示数组中的元素都是复数
a = np.zeros((3, 4), dtype=np.int)
print(a)



[[0 0 0 0]
 [0 0 0 0]
 [0 0 0 0]]
a = np.ones((3, 4), dtype=np.int)
print(a)



[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]]
a = np.empty((3, 4))
print(a)



[[3.51988719e+016 8.23900250e+015 1.17316622e+079 7.49229521e+247]
 [2.21210356e+214 3.50849418e+016 1.31531594e-047 7.32845376e+025]
 [1.71130458e+059 1.62980191e+045 2.67108442e+098 1.42681594e-312]]
a = np.arange(10, 20, 2)  # 定义从10到20(左开右闭),间隔为2的数组
print(a)



[10 12 14 16 18]
a = np.linspace(1, 10, 4)   # 把1到10等分成4份(每个数字之间的间隔都是相同的),然后输出
print(a)



[ 1.  4.  7. 10.]

四、用Numpy进行矩阵的运算

  • dot(a,b)函数–表示将a矩阵与b矩阵进行矩阵的运算
  • a.dot(b)函数–表示将a矩阵与b矩阵进行矩阵的运算
a = np.array([[1, 1],
              [0, 1]])
b = np.arange(4).reshape((2, 2))
c = a * b
c_dot = np.dot(a, b)   # dot表示矩阵的运算
#c_dot = a.dot(b)   # dot表示矩阵的运算
print(c)
print(c_dot)



[[0 1]
 [0 3]]
[[2 4]
 [2 3]]
  • sum(a)–求a矩阵中所有元素的总和
  • min(a)–求a矩阵中所有元素的最小值
  • max(a)–求a矩阵中所有元素的最大值
a = np.random.random((2,2))
print(a)
print(np.sum(a))
print(np.min(a))
print(np.max(a))



[[0.37261234 0.89570521]
 [0.86988402 0.58789557]]
2.7260971342420617
0.3726123374803223
0.8957052061265958

A = np.arange(2,14).reshape((3,4))
print(np.argmin(A))
print(np.argmax(A))



0
11

A = np.arange(2,14).reshape((3,4))
print(f'对于行进行计算的数值:{np.mean(A,axis=1)}')   # 计算平均值   axis = 1对于 行 进行计算
print(f'对于列进行计算的数值:{np.average(A,axis=0)}')   # 计算平均值 axis = 0对于 列 进行计算
print(np.median(A))   # 计算中位数



对于行进行计算的数值:[ 3.5  7.5 11.5]
对于列进行计算的数值:[6. 7. 8. 9.]
7.5

A = np.arange(2,14).reshape((3,4))
print(np.cumsum(A))   # 输出累加的值!!!!!
print(np.diff(A))   # 输出累差的值!!!!!
print(np.nonzero(A))  # 输出非0的坐标!!!!
print(np.sort(A))   # 对矩阵进行排序!!!!



[ 2  5  9 14 20 27 35 44 54 65 77 90]
[[1 1 1]
 [1 1 1]
 [1 1 1]]
(array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int32), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int32)) # 这个坐标是前面的每一个与后面的每一个构成一个完整的坐标。
[[ 2  3  4  5]
 [ 6  7  8  9]
 [10 11 12 13]]

A = np.arange(2,14).reshape((3,4))
print(np.transpose(A))  # 对矩阵进行转置操作!!!!
print(np.clip(A,5,9))  # 小于5的数直接取5,大于9的数直接取9,保留处在5和9之间的数字



[[ 2  6 10]
 [ 3  7 11]
 [ 4  8 12]
 [ 5  9 13]]
[[5 5 5 5]
 [6 7 8 9]
 [9 9 9 9]]

五、Numpy的索引操作

a = np.arange(10)
print(a[2:7:2])   # 表示从2到7进行切片,间隔为2

x = np.array([[1,  2],  [3,  4],  [5,  6]])
y = x[[0,1,2],  [0,1,0]]  # 获取数组中(0,0),(1,1)和(2,0)位置处的元素。
print (y)



[2 4 6]
[1 4 5]

a = np.arange(3,15).reshape((3,4))
print(a)
print(a[2])
print(a.T) # 矩阵a的转置




[[ 3  4  5  6]
 [ 7  8  9 10]
 [11 12 13 14]]
[11 12 13 14]
[[ 3  7 11]
 [ 4  8 12]
 [ 5  9 13]
 [ 6 10 14]]

a = np.arange(3,15).reshape((3,4))
for row in a:
    print(row)   # 输出每行
for colunmn in a.T:
    print(colunmn)  # 输出每列



[3 4 5 6]
[ 7  8  9 10]
[11 12 13 14]
[ 3  7 11]
[ 4  8 12]
[ 5  9 13]
[ 6 10 14]

a = np.arange(3,15).reshape((3,4))
print(a.flatten())
for item in a.flat:
    print(item)   # 输出矩阵中的每个元素



[ 3  4  5  6  7  8  9 10 11 12 13 14]
3
4
5
6
7
8
9
10
11
12
13
14

六、Numpy的数组的合并操作

a = np.array([1, 1, 1])
b = np.array([2, 2, 2])
print(np.vstack((a, b)))    # 数组a和数组b的合并(上下合并)
d = np.hstack((a, b))    # 数组a和数组b的合并(左右合并)
print(d)



[[1 1 1]
 [2 2 2]]
[1 1 1 2 2 2]

a = np.array([1, 1, 1])
b = np.array([2, 2, 2])
print(a[:, np.newaxis])
print(a[:, np.newaxis].shape)  # 在后面加上了一个维度
print(a[np.newaxis, :].shape)  # 在前面加上了一个维度



[[1]
 [1]
 [1]]
(3, 1)
(1, 3)

a = np.array([1, 1, 1])[:, np.newaxis]
b = np.array([2, 2, 2])[:, np.newaxis]
print(a)
print(b)
c = np.vstack((a, b))  # 数组a和数组b的合并(上下合并)
print(c)
d = np.hstack((a, b))  # 数组a和数组b的合并(左右合并)
print(d)




[[1]
 [1]
 [1]]
[[2]
 [2]
 [2]]
[[1]
 [1]
 [1]
 [2]
 [2]
 [2]]
[[1 2]
 [1 2]
 [1 2]]

a = np.array([1, 1, 1])[:, np.newaxis]
b = np.array([2, 2, 2])[:, np.newaxis]
c = np.concatenate((a, b, b, a), axis=1)  # 横向合并
print(c)
d = np.concatenate((a, b, b, a), axis=0)  # 纵向合并
print(d)



[[1 2 2 1]
 [1 2 2 1]
 [1 2 2 1]]
[[1]
 [1]
 [1]
 [2]
 [2]
 [2]
 [2]
 [2]
 [2]
 [1]
 [1]
 [1]]

七、Numpy的array的分割

a = np.arange(12).reshape((3, 4))
print(a)
print(np.split(a, 3, axis=0))  # 横向分割
print(np.vsplit(a, 3))   # 横向分割



[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
a = np.arange(12).reshape((3, 4))
print(a)
print(np.split(a, 4, axis=1))  # 纵向分割
print(np.hsplit(a, 2))   # 纵向分割



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

Process finished with exit code 0

八、Numpy的copy

# numpy的copy

a = np.arange(4)
print(f'改变前的a:{a}')
b = a
c = a
d = b
a[0] = 11
# a,b,c,d四个变量都是互相关联的,改变了一个,其余的三个都会被改变
print(f'改变后的a:{a}')
print(f'随之改变的b:{b}\n随之改变的c:{c}')  


b = a.copy()
a[3] = 21
print(f'copy a 后的b的数组不变:{b}')
print(f'a的数组的值改变了:{a}')




改变前的a:[0 1 2 3]
改变后的a:[11  1  2  3]
随之改变的b:[11  1  2  3]
随之改变的c:[11  1  2  3]
copy a 后的b的数组不变:[11  1  2  3]
a的数组的值改变了:[11  1  2 21]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kinght_123

我会继续努力创造更多的优秀作品

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值