numpy的用法(一)

import numpy as np

"""
    定义数组的常用方法arrayarange,linspace,logspace,ogrid,mgrid
"""
#传入array的对象可以但个数,也可以是列表
np.array([1,2,4,5])

Out[3]:
array([1, 2, 4, 5])

# array的另一个参数dtype用来制定列表数据类型,np.int整型,np.complex复数
np.array([[1,2,3],[4,5,6]],dtype = np.int)
Out[4]:
array([[1, 2, 3],
       [4, 5, 6]])

# arange的三个参数是(始值,终值,步长)
np.arange(10,20,2)
Out[5]:
array([10, 12, 14, 16, 18])

# linspace生成等差数组,参数是(始值,终值,个数,是否包含终值,元素类型)
np.linspace(0,100,50,endpoint= False,dtype= np.int)
Out[6]:
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])

# logspace生成等比数列,参数分别为(始值,终值,个数,对数的底,类型)
np.logspace(1,2,10,endpoint= False,base= 10.0,dtype= None)
Out[7]:
array([ 10.        ,  12.58925412,  15.84893192,  19.95262315,
        25.11886432,  31.6227766 ,  39.81071706,  50.11872336,
        63.09573445,  79.43282347])

# 按函数方式生成数组
def func(i, j):
    return (i+ 1)*(j+ 1)

np.fromfunction(func,(9,9))
Out[8]:
array([[  1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.],
       [  2.,   4.,   6.,   8.,  10.,  12.,  14.,  16.,  18.],
       [  3.,   6.,   9.,  12.,  15.,  18.,  21.,  24.,  27.],
       [  4.,   8.,  12.,  16.,  20.,  24.,  28.,  32.,  36.],
       [  5.,  10.,  15.,  20.,  25.,  30.,  35.,  40.,  45.],
       [  6.,  12.,  18.,  24.,  30.,  36.,  42.,  48.,  54.],
       [  7.,  14.,  21.,  28.,  35.,  42.,  49.,  56.,  63.],
       [  8.,  16.,  24.,  32.,  40.,  48.,  56.,  64.,  72.],
       [  9.,  18.,  27.,  36.,  45.,  54.,  63.,  72.,  81.]])

# 读取二进制文件
np.fromfile('二进制文件路径')

# 通过正则表达式regexp比配文件file中的内容,返回匹配的数组
file = open(r'C:\Users\amtsing\Desktop\备份\个人文档\居民消费.csv')
import re
reg = re.compile('%d')
np.fromregex(file= file,regexp= reg,dtype= None)
Out[9]:
array([], dtype=float64)

# 同时生成列行数组
x, y = np.ogrid[0:5:2, 1:6:2]
x
Out[10]:
array([[0],
       [2],
       [4]])
y
Out[11]:
array([[1, 3, 5]])
x + y
Out[12]:
array([[1, 3, 5],
       [3, 5, 7],
       [5, 7, 9]])

# 同时生成多行、多列矩阵
a, b = np.mgrid[0:5:2, 1:6:2]
a
Out[13]:
array([[0, 0, 0],
       [2, 2, 2],
       [4, 4, 4]])
b
Out[14]:
array([[1, 3, 5],
       [1, 3, 5],
       [1, 3, 5]])
a + b
Out[15]:
array([[1, 3, 5],
       [3, 5, 7],
       [5, 7, 9]])

# 获取矩阵属性,shape大小,dtype类型,n.dim维数,T转置, base基础元素
c = a+ b
c.shape, c.dtype, c.ndim, c.T, c.base
Out[16]:
((3, 3),
 dtype('int32'),
 2,
 array([[1, 3, 5],
        [3, 5, 7],
        [5, 7, 9]]))
 array([1,2,3,4,5,6,7,8,9])
# 改变数组大小用reshape
c, c.reshape(9,-1)
Out[17]:
(array([[1, 3, 5],
        [3, 5, 7],
        [5, 7, 9]]),
 array([[1],
        [3],
        [5],
        [3],
        [5],
        [7],
        [5],
        [7],
        [9]]))
# 或者是直接用shape改变大小
c.shape = 3,-1
c
Out[18]:
array([[1, 3, 5],
       [3, 5, 7],
       [5, 7, 9]])

# 对数组reshape后再传入array生成多维数组
np.array(np.arange(1,10).reshape(3,3))
Out[19]:
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
# resize能裁剪数组,有两个参数,一个是数组,另一个是new_shape
a = np.arange(9).reshape(3, 3)
np.resize(a, new_shape= (3,1))
Out[19]:
array([[0],
       [1],
       [2]])
# 更改元素属性
a.astype(np.float)
Out[19]:
array([ 0.,  1.,  2.])


# 对数组做如下处理:返回排序后的数组集合,
# return_index是否返回索引位置,
# return_inverse是否返回逆序
# return_counts是否返回累计值
np.unique(ar= [2,2,4,1,3,5,1,3,2],
          return_index= True,
          return_inverse= True,
          return_counts= True,axis= None)
Out[20]:
(array([1, 2, 3, 4, 5]),
 array([3, 0, 4, 2, 5], dtype=int64),
 array([1, 1, 3, 0, 2, 4, 0, 2, 1], dtype=int64),
 array([2, 3, 2, 1, 1], dtype=int64))

# 生成索引排序数组,可以快速找到最小值和最大值的位置,比如例子中最小值在位置2,最大值在位置5
np.argsort([2,2,4,1,3,5,1,3,2],axis= -1,kind= 'quicksort')
Out[21]:
array([3, 6, 0, 1, 8, 4, 7, 2, 5], dtype=int64)

# 矩阵叠加,参数为((arrays,轴),所有的传入数组大小要相同
np.stack(([4,3,2],[1,2,3]),axis= 0)
Out[22]:
array([[4, 3, 2],
       [1, 2, 3]])
np.concatenate(([4,3,2],[1,2,3]),axis= 0)
Out[23]:
array([4, 3, 2, 1, 2, 3])

# 行叠加、列叠加和交叠加
np.hstack(([4,3,2],[1,2,3]))
Out[24]:
array([4, 3, 2, 1, 2, 3])
np.vstack(([4,3,2],[1,2,3]))
Out[25]:
array([[4, 3, 2],
       [1, 2, 3]])
np.dstack(([4,3,2],[1,2,3]))
Out[26]:
array([[[4, 1],
        [3, 2],
        [2, 3]]])

# 数组拆分,indices_or_sections表示切分位置
np.split([1,2,3,4,5,6],indices_or_sections= (3,6),axis= 0)
Out[27]:
[array([1, 2, 3]), array([4, 5, 6]), array([], dtype=int32)]
np.hsplit(np.arange(1,9),indices_or_sections= (2,4))
Out[28]:
[array([1, 2]), array([3, 4]), array([5, 6, 7, 8])]
np.vsplit(np.arange(1,9).reshape(8,-1),indices_or_sections= (2,4))
Out[29]:
[array([[1],
        [2]]), array([[3],
        [4]]), array([[5],
        [6],
        [7],
        [8]])]
# dsplit必须传入三维数组
np.dsplit(np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]).
          reshape(2, 2, -1),
          indices_or_sections=(2, 4, 6))
Out[30]:
[array([[[1, 2],
         [4, 5]],

        [[7, 8],
         [10, 11]]]),
                    array([[[3],
                              [6]],

                             [[9],
                              [12]]]),
        array([], shape=(2, 2, 0), dtype=int32), array([], shape=(2, 2, 0), dtype=int32)]

# 数组倍扩。reps是重复次数,且可以传入数组
np.tile(np.arange(9).reshape(3,3),reps= 2)
Out[31]:
array([[0, 1, 2, 0, 1, 2],
       [3, 4, 5, 3, 4, 5],
       [6, 7, 8, 6, 7, 8]])

# 数组增广
np.append(arr=np.arange(3),values= [4,5,6],axis= 0)
Out[32]:
array([0, 1, 2, 4, 5, 6])

# 插入新行、列
np.insert(np.arange(9).reshape(3,3),obj= 2,values= [3,6,9],axis= 1)
Out[33]:
array([[0, 1, 3, 2],
       [3, 4, 6, 5],
       [6, 7, 9, 8]])

# 删除数组行或列
np.delete(np.arange(9).reshape(3,3),obj= 2,axis= 1)
Out[34]:
array([[0, 1],
       [3, 4],
       [6, 7]])

# 生成三角数组,k=0标准下三角矩阵,k是控制对角线上下零行的参数
np.tri(N= 3, M= 4, k= 0, dtype= None)
Out[35]:
array([[ 1.,  0.,  0.,  0.],
       [ 1.,  1.,  0.,  0.],
       [ 1.,  1.,  1.,  0.]])
np.tri(N= 3, M= 4, k= -1, dtype= None)
Out[36]:
array([[ 0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.],
       [ 1.,  1.,  0.,  0.]])

# 生成下三角数组,m可以传入数组,也可以传入元组
np.tril(m= [1,2,3], k= 0)
Out[37]:
array([[1, 0, 0],
       [1, 2, 0],
       [1, 2, 3]])
np.tril(m= [[1,2,3],[4,5,6]], k= 0)
Out[38]:
array([[1, 0, 0],
       [4, 5, 0]]
# 生成下三角数组
np.triu(m= [[1,2,3],[4,5,6]], k= 0)
Out[39]:
array([[1, 2, 3],
       [0, 5, 6]])

# 生成范德蒙数组,x必须是数组或序列
np.vander(x= [2,3,4], N= 3, increasing= False)
Out[40]:
array([[ 4,  2,  1],
       [ 9,  3,  1],
       [16,  4,  1]])

# 多维数组变一维数组,order是平坦化方式
np.ravel(np.arange(9).reshape(3,3), order= 'C')
Out[41]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
# 还可以用flatten方法
np.arange(9).reshape(3,3).flatten()
Out[42]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8])

# zeros生成全零数组,同样ones是生成全一数组,moveaxis是维度变换
x = np.zeros((2, 3, 4))
x
Out[43]:
array([[[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]],
       [[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]]])
np.moveaxis(x, source= 0, destination= -1)
Out[44]:
array([[[ 0.,  0.],
        [ 0.,  0.],
        [ 0.,  0.],
        [ 0.,  0.]],
       [[ 0.,  0.],
        [ 0.,  0.],
        [ 0.,  0.],
        [ 0.,  0.]],
       [[ 0.,  0.],
        [ 0.,  0.],
        [ 0.,  0.],
        [ 0.,  0.]]])
# 轴变换,用法近似moveaxis
np.rollaxis(x, axis= 1, start= 0)
Out[45]:
array([[[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]],
       [[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]],
       [[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]]])

# 数组沿轴axis,转动shift个的位数
>>> x = np.arange(10)
>>> np.roll(x, 2)
array([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])
>>> x2 = np.reshape(x, (2,5))
>>> x2
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
>>> np.roll(x2, 1)
array([[9, 0, 1, 2, 3],
       [4, 5, 6, 7, 8]])
>>> np.roll(x2, 1, axis=0)
array([[5, 6, 7, 8, 9],
       [0, 1, 2, 3, 4]])
>>> np.roll(x2, 1, axis=1)
array([[4, 0, 1, 2, 3],
       [9, 5, 6, 7, 8]])

# rot90,逆时针转90,有参数(数组,旋转次数k,需要转动的轴或维度axis>>> m = np.array([[1,2],[3,4]], int)
>>> m
array([[1, 2],
       [3, 4]])
>>> np.rot90(m)
array([[2, 4],
       [1, 3]])
>>> np.rot90(m, 2)
array([[4, 3],
       [2, 1]])
>>> m = np.arange(8).reshape((2,2,2))
>>> np.rot90(m, 1, (1,2))
array([[[1, 3],
        [0, 2]],
       [[5, 7],
        [4, 6]]])

# swapases交换两轴
a = np.arange(4).reshape(2,2)
a
Out[46]:
array([[0, 1],
       [2, 3]])
np.swapaxes(a, axis1= 1, axis2 =0)
Out[47]:
array([[0, 2],
       [1, 3]])

# 生成一个像a的全一数组,同理有zeros_like
a = [[1,2,3],[4,5,6]]
np.ones_like(a,dtype= None,order='k')
Out[48]:
array([[1, 1, 1],
       [1, 1, 1]])

# eye可用于生成单位数组
np.eye(N= 3, M= 4, k= -1, dtype= None)
Out[49]:
array([[ 0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.]])
# 生成单位方阵
np.identity(3)
Out[50]:
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])
# 重复元素
a.repeat(2, axis= 0)
Out[83]:
array([1, 1, 2, 2, 3, 3])

"""
    建立向量矩阵
"""
# 方法一:用asmatrix
a = np.arange(1,10).reshape(3,3)
a
Out[1]:
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
np.asmatrix(a,dtype= None)
Out[2]:
matrix([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]])

# 方法二,matrix或者bmat
np.matrix(np.arange(0,9),dtype= None)
Out[3]:
matrix([[0, 1, 2, 3, 4, 5, 6, 7, 8]])
np.bmat(np.arange(0,9),ldict = None,gdict= None)
Out[4]:
matrix([[0, 1, 2, 3, 4, 5, 6, 7, 8]])
np.mat(np.arange(9).reshape(3,3),dtype= None)
Out[5]:
matrix([[0, 1, 2],
        [3, 4, 5],
        [6, 7, 8]])



# 方法三,传入字符串
np.matrix('1, 2; 3, 4')
Out[6]:
matrix([[1, 2],
        [3, 4]])
np.matrix('1 2; 3 4')
Out[7]:
matrix([[1, 2],
        [3, 4]])
np.matrix('1,2,3,4').reshape(2,2)
Out[8]:
matrix([[1, 2],
        [3, 4]])

# 向量化
np.vectorize(np.arange(9))
Out[9]:
<numpy.lib.function_base.vectorize at 0x1ac768bac88>

"""
    文件存取
"""

# tofile,fromfile
import os

os.chdir("d:\\")
a = np.arange(0,12)
a.reshape(3,4)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

a.tofile("a.bin")                                    #保存至a.bin

b = np.fromfile("a.bin", dtype=np.int32)  #从文件中加载数组,错误的dtype会导致错误的结果
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

b.reshape(3,4)#读取的数据将为一维数组,需要使用reshape改变其数组结构
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

# load()save()Numpy专用的二进制格式保存数据,它们会自动处理元素类型和形状等信息。savez()提供了将多个数组存储至一个
# 文件的能力,调用load()方法返回的对象,可以使用数组名对各个数组进行读取。默认数组名arr_0,arr_1,arr_2......
np.save("a.npy", a.reshape(3,4))
c = np.load("a.npy")
c
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
a = np.array([[1,2,3],[4,5,6]])
b = np.arange(0,1.0,0.1)
c = np.sin(b)
np.savez("result.npz", a, b, sin_arr=c)  #使用sin_arr命名数组c
r = np.load("result.npz") #加载一次即可
r["arr_0"]
array([[1, 2, 3],
       [4, 5, 6]])
r["arr_1"]
array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9])
r["sin_arr"]
array([ 0.        ,  0.09983342,  0.19866933,  0.29552021,  0.38941834,
        0.47942554,  0.56464247,  0.64421769,  0.71735609,  0.78332691])

# savetxt() & loadtxt()
a = np.arange(0,12,0.5).reshape(4,-1)
a
array([[  0. ,   0.5,   1. ,   1.5,   2. ,   2.5],
       [  3. ,   3.5,   4. ,   4.5,   5. ,   5.5],
       [  6. ,   6.5,   7. ,   7.5,   8. ,   8.5],
       [  9. ,   9.5,  10. ,  10.5,  11. ,  11.5]])
np.savetxt("a.txt", a)
np.loadtxt("a.txt")
array([[  0. ,   0.5,   1. ,   1.5,   2. ,   2.5],
       [  3. ,   3.5,   4. ,   4.5,   5. ,   5.5],
       [  6. ,   6.5,   7. ,   7.5,   8. ,   8.5],
       [  9. ,   9.5,  10. ,  10.5,  11. ,  11.5]])
np.savetxt("a.txt", a, fmt="%d", delimiter=",") #指定存储数据类型为整型,分隔符为,
np.loadtxt("a.txt", delimiter=',') #以,分隔符读取
array([[  0.,   0.,   1.,   1.,   2.,   2.],
       [  3.,   3.,   4.,   4.,   5.,   5.],
       [  6.,   6.,   7.,   7.,   8.,   8.],
       [  9.,   9.,  10.,  10.,  11.,  11.]])

你可能感兴趣的:(函数库使用技巧)