numpy如果使用python做过机器学习或者科学计算方面项目的朋友并陌生,它是一个非常好用的python科学计算库,而且numpy是用c实现的,效率也非常高。这篇博客译自斯坦福大学python快速入门教程的numpy快速入门教程,除此之外我还添加了一些自己的见解。
一、numpy创建数组
import numpy as np
#numpy数组创建
if __name__ == "__main__":
#通过Python的列表来初始化数组
a = np.array([1,2,3])
print(a) #[1 2 3]
#获取数组的类型
print(type(a)) #<class 'numpy.ndarray'>
#获取数组的shape
print(a.shape) #(3,)
#修改数组中的元素
a[1] = 9
print(a) #[1 9 3]
#通过numpy内置的函数来初始化数组
#创建一个全0的数组
b = np.zeros((3,3))
print(b)
'''
[[ 0. 0. 0.]
[ 0. 0. 0.]
[ 0. 0. 0.]]
'''
#创建一个全1的数组
c = np.ones((3,3))
print(c)
'''
[[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]]
'''
#创建一个指定的矩阵
d = np.full((3,3),6)
print(d)
'''
[[ 6. 6. 6.]
[ 6. 6. 6.]
[ 6. 6. 6.]]
'''
#创建一个单位矩阵
e = np.eye(3)
print(e)
'''
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
'''
#创建一个随机数的矩阵
f = np.random.random((3,3))
print(f)
'''
[[ 0.96550928 0.59525056 0.58061721]
[ 0.21303049 0.82996793 0.77914749]
[ 0.30441988 0.6055475 0.93730574]]
'''
二、numpy切片
import numpy as np
if __name__ == "__main__":
#数组切片
#创建一个数组
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
#对numpy数组进行切片
#切片的时候,下标是从0开始的,但是不包括右边区间
b = a[:2,:3]
print(b)
'''
[[1 2 3]
[4 5 6]]
'''
c = a[1:2,1:2]
print(c)
'''
[[5]]
'''
#改变切片后的任意一个元素值,所有的数组相应的值也都会发现改变,这里与Python的列表切片有所不同
#从下面的结果其实可以将numpy的切片理解成为地址的复制
c[0,0] = 55
print(a)
'''
[[ 1 2 3]
[ 4 55 6]
[ 7 8 9]]
'''
print(b)
'''
[[ 1 2 3]
[ 4 55 6]]
'''
print(c)
'''
[[55]]
'''
'''
下面通过三种不同的切片方法来获取数组a的最后一行元素
通过下面可以发现,其实第一种方法和第三种方法的结果是一样的
可以理解成a[2]其实就是指定获取数组第二行的所有元素
'''
#获取的数组比原数组的阶要低
row_1 = a[2,:]
print(row_1) #[7 8 9]
print(row_1.shape) #(3,)
#获取的数组与原数组拥有相同的阶
row_2 = a[2:3,:]
print(row_2) #[[7 8 9]]
print(row_2.shape) #(1, 3)
row_3 = a[2]
print(row_3) #[7 8 9]
print(row_3.shape) #(3,)
'''
通过上面对数组进行切片操作,也许你会发现一个问题,
获取的数组总是原数组的子数组,要么是属于原数组的某(几)一行或者某(几)一列中的元素
下面介绍一种获取原数组中任意元素所组成的数组的方法
'''
arbitrary = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
#[0,0,2]作为数组arbitrary行的下标,[0,1,2]作为数组列的下标,然后进行一一对应组合
arbitrary_1 = arbitrary[[0,0,2],[0,1,2]]
print(arbitrary_1) #[1 2 9]
arbitrary_2 = np.array([arbitrary[0,0],arbitrary[0,1],arbitrary[2,2]])
print(arbitrary_2) #[1 2 9]