文章目录

import numpy as np

Numpy 基础数据结构

参看ndarray数据属性

例如参看数据,秩,维度,大小…

dtype(查看数组元素类型)

demo = np.array([1,2,3,4,5,6,7])
demo.dtype
dtype('int32')

ndim(输出数组维度的个数(轴数),或者说“秩”,维度的数量也称rank)

demo.ndim
1

shape(数组的维度,对于n行m列的数组,shape为(n,m))

demo.shape
(7,)

size(数组的元素总数,对于n行m列的数组,元素总数为n*m)

demo.size
7

itemsize(数组中每个元素的字节大小,int32l类型字节为4,float64的字节为8)

demo.itemsize
4

nbytes(共多少字节)

demo.nbytes
28

创建数组

array()函数,括号里是列表. 元组. 数组.生成器.

np.array(range(10))
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.array([[1,2,3],("a","b","c")])
array([['1', '2', '3'],
       ['a', 'b', 'c']],
      dtype='<U11')

arange(),给定间隔内返回均匀间隔值

np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.arange(10.0)
array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.])
np.arange(5,12)
array([ 5,  6,  7,  8,  9, 10, 11])
np.arange(5,12,3)
array([ 5,  8, 11])

linspace(),返回在间隔[开始,停止]上计算的num个均匀间隔的样本.

np.linspace(2.0,3.0,num=5)
array([ 2.  ,  2.25,  2.5 ,  2.75,  3.  ])
np.linspace(2.0,3.0,num=5,endpoint=False)
array([ 2. ,  2.2,  2.4,  2.6,  2.8])
np.linspace(2.0,3.0,num=5,retstep=True)
(array([ 2.  ,  2.25,  2.5 ,  2.75,  3.  ]), 0.25)

创建数组 ,zeros(),ones(),eye().

np.zeros(5)
array([ 0.,  0.,  0.,  0.,  0.])
np.zeros((2,2), dtype = np.int)
array([[0, 0],
       [0, 0]])
np.ones(9)
array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])
np.ones((2,3,4))
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.]]])
np.eye(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.]])

ndarray 数据类型

ndarray的数据类型

numpy_博客.md-LMLPHP

通用属性(函数)

改变数组形状:.T,reshape(),resize()

ar1 = np.array([[1,2,3],[4,5,6]])
ar1
array([[1, 2, 3],
       [4, 5, 6]])
ar1.T
array([[1, 4],
       [2, 5],
       [3, 6]])
ar1.reshape(3,2)
array([[1, 2],
       [3, 4],
       [5, 6]])
np.resize(np.arange(5),(3,4))## numpy.resize(a, new_shape):返回具有指定形状的新数组,如有必要可重复填充所需数量的元素。
array([[0, 1, 2, 3],
       [4, 0, 1, 2],
       [3, 4, 0, 1]])

数组复制 :copy()

ar1 = np.arange(10)
ar2 = ar1
id(ar2) == id(ar1) # 指向内存中生成的一个值 → 这里ar1和ar2指向同一个值,所以ar1改变,ar2一起改变
True
ar3 = ar1.copy()
id(ar3) == id(ar1)
False

数组类型转换:astype()

ar1.astype(np.float32)
array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.], dtype=float32)

数组堆叠

a = np.arange(5)
b = np.arange(5,10)
a
array([0, 1, 2, 3, 4])
b
array([5, 6, 7, 8, 9])

水平叠加

np.hstack((a,b)) # 真正意义水平叠加
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.column_stack((a,b)) # 行向量变成列向量叠加
array([[0, 5],
       [1, 6],
       [2, 7],
       [3, 8],
       [4, 9]])
np.concatenate((a,b),axis=0)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

垂直叠加

a
array([0, 1, 2, 3, 4])
b
array([5, 6, 7, 8, 9])
np.vstack((a,b))
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
np.row_stack((a,b))
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

深度叠加

np.dstack((a,b))
array([[[0, 5],
        [1, 6],
        [2, 7],
        [3, 8],
        [4, 9]]])

数组拆分

ar = np.arange(16).reshape(4,4)
ar
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

沿横向轴拆分

np.hsplit(ar,2)
[array([[ 0,  1],
        [ 4,  5],
        [ 8,  9],
        [12, 13]]), array([[ 2,  3],
        [ 6,  7],
        [10, 11],
        [14, 15]])]
np.split(ar,2,axis=1)
[array([[ 0,  1],
        [ 4,  5],
        [ 8,  9],
        [12, 13]]), array([[ 2,  3],
        [ 6,  7],
        [10, 11],
        [14, 15]])]

沿纵向轴拆分

np.vsplit(ar,2)
[array([[0, 1, 2, 3],
        [4, 5, 6, 7]]), array([[ 8,  9, 10, 11],
        [12, 13, 14, 15]])]
np.split(ar,2,axis=0)
[array([[0, 1, 2, 3],
        [4, 5, 6, 7]]), array([[ 8,  9, 10, 11],
        [12, 13, 14, 15]])]

数组转换成list

ar
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
ar.tolist()
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]

数组简单运算

ar = np.arange(20)
ar
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19])

求和

np.sum(ar)
190

求均值

np.mean(ar)
9.5

求最大值

np.max(ar)
19

求最小值

np.min(ar)
0

标准偏差

np.std(ar)
5.7662812973353983

方差

np.var(ar)
33.25

累加值

np.cumsum(ar)
array([  0,   1,   3,   6,  10,  15,  21,  28,  36,  45,  55,  66,  78,
        91, 105, 120, 136, 153, 171, 190], dtype=int32)

累乘积值

np.cumprod(ar)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32)

索引及切片

基本索引及切片

一维数组的切片和索引(和列表类似)

ar = np.arange(20)
ar
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19])
ar[4]
4
ar[3:6]
array([3, 4, 5])

二维数组的切片和索引

ar = np.arange(16).reshape(4,4)
ar
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
ar[2]
array([ 8,  9, 10, 11])
ar[2][1]
9
ar[2,1]
9
ar[1:3]
array([[ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
ar[:2,1:]
array([[1, 2, 3],
       [5, 6, 7]])

布尔型索引及切片

ar = np.arange(12).reshape(3,4)
i = np.array([True,False,True])
j = np.array([True,True,False,False])
ar
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
ar[i,:]
array([[ 0,  1,  2,  3],
       [ 8,  9, 10, 11]])
ar[:,j]
array([[0, 1],
       [4, 5],
       [8, 9]])
ar[ar>5]
array([ 6,  7,  8,  9, 10, 11])

数组索引及切片的值更改,复制

ar = np.arange(10)
ar
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
ar[7:9] = 100
ar
array([  0,   1,   2,   3,   4,   5,   6, 100, 100,   9])

随机数

随机数生成

np.random.normal(size=(4,4))
array([[-0.28424203,  1.24778222, -1.87188203, -0.48618607],
       [ 2.46265095, -0.10825467,  0.3068793 , -0.23980028],
       [ 0.18263344, -0.07816352,  0.6084669 , -0.18581258],
       [-1.20808137, -0.8982028 , -0.92821719, -0.96498775]])

numpy.random.rand(d0, d1, ..., dn):生成一个[0,1)之间的随机浮点数或N维浮点数组 —— 均匀分布

np.random.rand()
0.5718965755174878
np.random.rand(4)
array([ 0.50897674,  0.96063824,  0.30698317,  0.41407583])
np.random.rand(2,3)
array([[ 0.88528773,  0.87437328,  0.02799432],
       [ 0.21416104,  0.03953028,  0.85786322]])

numpy.random.randint(low, high=None, size=None, dtype='l'):生成一个整数或N维整数数组

np.random.randint(2)
0
np.random.randint(2,size=5)
array([0, 0, 1, 0, 0])
np.random.randint(2,6,size=5)
array([2, 2, 3, 2, 2])

数组广播

当数组跟一个标量进行数学运算时,标量需要根据数组的形状进行扩展,然后执行运算

数据的输入输出

存储数组数据

ar = np.random.rand(5,5)
ar
array([[ 0.92156293,  0.17349579,  0.01742218,  0.80235236,  0.92179612],
       [ 0.53347415,  0.66165762,  0.91499678,  0.8456032 ,  0.53456262],
       [ 0.91645928,  0.56223024,  0.13649131,  0.64904072,  0.27637344],
       [ 0.1997809 ,  0.47236124,  0.25545203,  0.05874394,  0.26600728],
       [ 0.0076774 ,  0.77736906,  0.88875863,  0.33249434,  0.04386722]])
np.save('arraydata.npy', ar)

读取数组数据

np.load("arraydata.npy")
array([[ 0.92156293,  0.17349579,  0.01742218,  0.80235236,  0.92179612],
       [ 0.53347415,  0.66165762,  0.91499678,  0.8456032 ,  0.53456262],
       [ 0.91645928,  0.56223024,  0.13649131,  0.64904072,  0.27637344],
       [ 0.1997809 ,  0.47236124,  0.25545203,  0.05874394,  0.26600728],
       [ 0.0076774 ,  0.77736906,  0.88875863,  0.33249434,  0.04386722]])
10-05 19:11