此文是关于Numpy的一些基本用法, 内容来源于Numpy官网:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html
1.The Basics
1)导入numpy
import numpy as np
2)创建一个0--14的数组a, 并将其变为3行5列的二位数组
a = np.arange(15).reshape(3, 5) a array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
3)查看a的形状
a.shape
(3, 5)
4)查看a的维数
a.ndim
2
5)查看a中元素的数据类型
a.dtype dtype('int64')
6)查看数组中每个元素的字节大小
a.itemsize
8
7)查看数组a中所有元素的总个数
a.size
15
8)查看a的类型, 结果显示a是一个numpy数组
type(a)
numpy.ndarray
2.Array Creation
1)可以把一个python列表直接转为numpy数组
a = np.array([2,3,4])
a
array([2, 3, 4])
一个常见的错误是不能直接把元素放入函数小括号内, 需要单独的一个中括号包含着这些元素。
a = np.array(1,2,3,4) # WRONG --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-15-90a21e8c09d8> in <module>() ----> 1 a = np.array(1,2,3,4) # WRONG ValueError: only 2 non-keyword arguments accepted a = np.array([1,2,3,4]) # RIGHT a array([1, 2, 3, 4])
2)创建元素为0的数组
np.zeros( (3,4) )
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
3)创建元素为1的数组
np.ones( (2,3,4), dtype=np.int16 ) array([[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]], [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]], dtype=int16)
4)创建一个空数组
np.empty( (2,3) )
array([[ 0., 0., 0.],
[ 0., 0., 0.]])
5)设定区间, 并按照一定间隔创建数组
np.arange( 10, 30, 5 ) array([10, 15, 20, 25]) np.arange( 0, 2, 0.3 ) array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
6)在0到2之间均匀的生成9个数作为数组
from numpy import pi np.linspace( 0, 2, 9 ) array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])
3.Basic Operations
1)两个数组的元素相加减
a = np.array( [20,30,40,50] ) b = np.arange( 4 ) b array([0, 1, 2, 3]) c = a-b c array([20, 29, 38, 47])
2)数组的2次幂
b**2 array([0, 1, 4, 9]) 10*np.sin(a) array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854])
3)对数组内元素与一常量比较大小, 返回一个布尔数组
a<35
array([ True, True, False, False], dtype=bool)
4)两个数组的元素间相乘
A = np.array( [[1,1],[0,1]] ) B = np.array( [[2,0],[3,4]] ) A*B array([[2, 0], [0, 4]])
5)两个数组矩阵点乘, 有两种方法, 得到的结果是相同的。
A.dot(B) array([[5, 4], [3, 4]]) np.dot(A, B) array([[5, 4], [3, 4]])
6)数组的求和、最大值、最小值
a = np.random.random((2,3)) a array([[ 0.76423426, 0.45623695, 0.65700409], [ 0.75365929, 0.13244614, 0.23917196]]) a.sum(), a.max(), a.min() (3.0027526935349194, 0.76423426042527243, 0.13244614149075928)
4.Indexing, Slicing and Iterating
1)一维数组的索引与切片
a = np.arange(10)**3 a array([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]) # a的第三个元素 a[2] 8 # a的第三到第五个元素 a[2:5] array([ 8, 27, 64]) # a的从0到6个元素中, 索引能被2整除的都替换为-1000 a[:6:2] = -1000 a array([-1000, 1, -1000, 27, -1000, 125, 216, 343, 512, 729])
# 将a反转 a[ : :-1] array([ 729, 512, 343, 216, 125, -1000, 27, -1000, 1, -1000])
2)多维数组的索引与切片
def f(x,y): return 10*x+y b = np.fromfunction(f,(5,4),dtype=int) b array([[ 0, 1, 2, 3], [10, 11, 12, 13], [20, 21, 22, 23], [30, 31, 32, 33], [40, 41, 42, 43]]) b[2,3] 23 b[0:5, 1] array([ 1, 11, 21, 31, 41])
b[-1]
array([40, 41, 42, 43])
# 将数组展开 b.flatten()、 array([ 0, 1, 2, 3, 10, 11, 12, 13, 20, 21, 22, 23, 30, 31, 32, 33, 40, 41, 42, 43])
3)数组拼接
a = np.floor(10*np.random.random((2,2))) b = np.floor(10*np.random.random((2,2))) a array([[ 4., 7.], [ 9., 2.]]) b array([[ 8., 1.], [ 9., 5.]]) # 竖向拼接 np.vstack((a,b)) array([[ 4., 7.], [ 9., 2.], [ 8., 1.], [ 9., 5.]]) # 横向拼接 np.hstack((a,b)) array([[ 4., 7., 8., 1.], [ 9., 2., 9., 5.]])
# 横向拼接 np.column_stack((a,b)) array([[ 4., 7., 8., 1.], [ 9., 2., 9., 5.]])
4) 将数组分成几个小数组
a = np.floor(10*np.random.random((2,12))) a array([[ 2., 3., 2., 4., 2., 1., 5., 4., 4., 2., 0., 3.], [ 9., 2., 0., 2., 8., 3., 6., 2., 7., 2., 2., 6.]]) np.hsplit(a,3) # Split a into 3 [array([[ 2., 3., 2., 4.], [ 9., 2., 0., 2.]]), array([[ 2., 1., 5., 4.], [ 8., 3., 6., 2.]]), array([[ 4., 2., 0., 3.], [ 7., 2., 2., 6.]])] np.hsplit(a,(3,4)) # Split a after the third and the fourth column [array([[ 2., 3., 2.], [ 9., 2., 0.]]), array([[ 4.], [ 2.]]), array([[ 2., 1., 5., 4., 4., 2., 0., 3.], [ 8., 3., 6., 2., 7., 2., 2., 6.]])]