Numpy库①

2020-06-13  本文已影响0人  文嘉达_0da8

numpy是一个开源python扩充程序库,提供了高性能数组与矩阵运算处理能力。

一、ndarray多维数组

1. 创建ndarray数组

import numpy as np
data1=[5,7,9,20]                  #列表
data2=(5,7,9,20)                  #元组
data3=[[1,2,3,4],[5,6,7,8]]       #多维数组
arr1=np.array(data1)
arr2=np.array(data2)
arr3=np.array(data3)

arr1
arr2
arr3
array([5, 7, 9, 20])
array([5, 7, 9, 20])
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])

1.1 zeros函数

zeros函数可以创建指定长度或形状的全0数组。

np.zeros(6)
Out[ ]:  array([0., 0., 0., 0., 0., 0.])

np.zeros((3,4))
Out[ ]:  array([[0., 0., 0., 0.],
                [0., 0., 0., 0.],
                [0., 0., 0., 0.]])

np.zeros_like(arr3)
Out[ ]:  array([[0, 0, 0, 0],
                [0, 0, 0, 0]])

1.2 ones函数

ones函数可以创建指定长度或形状的全1数组。

np.ones(6)
Out[ ]:  array([1., 1., 1., 1., 1., 1.])

np.ones((3,4))
Out[ ]:  array([[1., 1., 1., 1.],
                [1., 1., 1., 1.],
                [1., 1., 1., 1.]])

np.ones_like(arr3)
Out[ ]:  array([[1, 1, 1, 1],
                [1, 1, 1, 1]])

1.3 empty函数

empty函数可以创建一个没有具体值的数组。

np.empty((2,2,2))
Out[ ]:  array([[[0.00000000e+000, 0.00000000e+000],
                 [0.00000000e+000, 0.00000000e+000]],

                 [[0.00000000e+000, 6.99596955e-321],
                 [8.70018274e-313, 8.90060779e-307]]])

1.4 arange函数

arange函数主要用于创建数组。

np.arange(6)
Out[ ]:  array([0, 1, 2, 3, 4, 5]) 

1.5 随机函数

import numpy as np
arr=np.random.randint(100,200,size=(3,4))
arr
Out[ ]: array([[135, 107, 119, 119],
               [138, 105, 122, 120],
               [186, 193, 144, 151]])
import numpy as np
arr=np.random.randn(2,3,2)
arr
Out[ ]: array([[[ 1.78521479, -0.41762213],
                [-1.71612921, -1.01758876],
                [-0.25929651, -0.43067282]],

               [[ 1.14328724, -1.13676288],
                [ 2.05677322,  2.03150197],
                [-0.39033181, -0.93722018]]])

2. ndarray属性

arr3.shape
Out[ ]: (2, 4)

arr3.dtype
Out[ ]: dtpye('int32')

2.1 ndarray数据类型

数组常见的数据类型有以下几种:浮点数(float)、整数(int)、复数(complex)、布尔值(bool)、字符串(string_和Python对象(object)

arr4=arr1.astype('float64')
arr4
Out[ ]:  array([ 5.,  7.,  9., 20.])

如果将浮点数转换为整数,并不会使用四舍五入的方式来转换,而是元素的小数部分都会被截断。

3. 数组变换

3.1 数组重塑

np.arange(9).reshape((3,3))
Out[ ]:  array([[0, 1, 2],
                [3, 4, 5],
                [6, 7, 8]])

reshape的参数中的一维参数可以设置为-1,表示数组的维度可以通过数据本身来推断。

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

与reshape相反的是数据散开(ravel)或扁平化(flatten)。

arr.ravel()
Out[ ]:  array([0, 1, 2, 3, 4, 5, 6, 7, 8])

3.2 数组合并

np.concatenate([arr3,arr3],axis=0)
Out[ ]:  array([[1, 2, 3, 4],
                [5, 6, 7, 8],
                [1, 2, 3, 4],
                [5, 6, 7, 8]])

np.concatenate([arr3,arr3],axis=1)
array([[1, 2, 3, 4, 1, 2, 3, 4],
       [5, 6, 7, 8, 5, 6, 7, 8]])

3.3 数组拆分

数组拆分是数组合并的相反操作,通过split可以将数组拆分为多个数组。

np.split(ary, indices_or_sections, axis=0)

ary:要切分的数组
indices_or_sections:如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置
axis:沿着哪个维度进行切向,默认为0,横向切分

import numpy as np
x = np.array([0,1,2,3,4,5,6,7,8])
print (np.split(x,3))
print (np.split(x,[3,5,6,9]))
print(np.split(x,[3,5,6,8]))
Out[ ]: 
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
[array([0, 1, 2]), array([3, 4]), array([5]), array([6, 7, 8]), array([], dtype=int32)]
[array([0, 1, 2]), array([3, 4]), array([5]), array([6, 7]), array([8])]

一维数组只有一个维度,所以切分只会在这一个维度进行。第一行输出对应indices_or_sections参数为一个整数,将数组平均分成了三份,第二行输出对应indices_or_sections参数为一个数组,此时每一次切分都会将要切分数组的前n(n=3,5,6,9)个元素切分出来,第一次n=3,进行数组切分得到array([0, 1, 2]),第二次n=5,进行数组切分得到array([3, 4]),此时数组前5个元素已经切分完毕,后续同理,最后一次n=9,切分完毕后数组所有元素已经被切分,所以最后一个array为array([], dtype=int32),对比第三行输出可以看出区别。

a = np.array([[1,2,3],
              [1,2,5],
              [4,6,7]])
print (np.split(a, [2, 3],axis = 0))
print (np.split(a, [1, 2],axis = 1))
Out[ ]: 
[array([[1, 2, 3],
        [1, 2, 5]]), array([[4, 6, 7]]), array([], shape=(0, 3), dtype=int32)]
[array([[1],
       [1],
       [4]]), array([[2],
       [2],
       [6]]), array([[3],
       [5],
       [7]])]

同样,二维数组的切分也是同理。第一行按第一个和第二个数组作为第一个切分,第三个数组作为第二个切分,后面已经没有数组,所以第三个切分为空值。

3.4 数组转置和轴对换

可以通过transpose方法进行转置。除了使用transpose方法外,也可以用T属性进行数组的转置,等同于transpose函数不带参数的效果。

import numpy as np 
arr=np.arange(12).reshape(3,4)
Out[ ]: array([[ 0,  1,  2,  3],
               [ 4,  5,  6,  7],
               [ 8,  9, 10, 11]])

arr.transpose((1,0))
arr.T
Out[ ]: array([[ 0,  4,  8],
               [ 1,  5,  9],
               [ 2,  6, 10],
               [ 3,  7, 11]])
arr=np.arange(16).reshape(2,2,4)
arr
Out[ ]: array([[[ 0,  1,  2,  3],
                [ 4,  5,  6,  7]],

               [[ 8,  9, 10, 11],
                [12, 13, 14, 15]]])
arr.transpose(2,1,0)
Out[ ]: array([[[ 0,  8],
                [ 4, 12]],

               [[ 1,  9],
                [ 5, 13]],

               [[ 2, 10],
                [ 6, 14]],

               [[ 3, 11],
                [ 7, 15]]])

arr这个数组有三个维度,三个维度的编号对应为(0,1,2),比如这样,我们需要拿到7这个数字,怎么办,肯定需要些三个维度的值,7的第一个维度为0,第二个维度为1,第三个3,所以arr[0,1,3]则拿到了7。再回到transpose()这个函数,它里面就是维度的排序,比如我们后面写的transpose(2,1,0),就是把之前第三个维度转为第一个维度,之前的第二个维度不变,之前的第一个维度变为第三个维度,好那么我们继续拿7这个值来说,之前的索引为[0,1,3],按照我们的转换方法,把之前的第三维度变为第一维度,之前的第一维度变为第三维度,那么现在7的索引就是(3,1,0)同理所有的数组内的数字都是这样变的。

arr.swapaxes(2,1)   #就是将第三个维度和第二个维度交换
Out[ ]: array([[[ 0,  4],
                [ 1,  5],
                [ 2,  6],
                [ 3,  7]],

               [[ 8, 12],
                [ 9, 13],
                [10, 14],
                [11, 15]]])
x = np.arange(4).reshape((2,2))
Out[ ]: array([[0, 1],
               [2, 3]])

我们不妨设第一个方括号“[]”为 0轴 ,第二个方括号为 1轴 ,则x可在 0-1坐标系 下表示如下:



因为 x.transpose((0,1)) 表示按照原坐标轴改变序列,也就是保持不变,而 x.transpose((1,0)) 表示交换 ‘0轴’ 和 ‘1轴’,所以就得到如下图所示结果:



我们来看一个三维的:
A = array([[[ 0,  1,  2,  3],
            [ 4,  5,  6,  7]],

           [[ 8,  9, 10, 11],
            [12, 13, 14, 15]]])

*该图形有问题,2轴应该是0,1,2,3升序

A.transpose((0,1,2))  #保持A不变
A.transpose((1,0,2))  #将 0轴 和 1轴 交换
A.transpose((1,0,2)) [0][1][2]  #根据上图这个结果应该是10

———————————————————
以上内容均来自书籍或网络,为个人的学习笔记,如有侵权,请联系删帖。

上一篇 下一篇

猜你喜欢

热点阅读