4.3 轴移动

moveaxis 可以将数组的轴移动到新的位置。其方法如下:

numpy.moveaxis(a, source, destination)  

其中:

  • a:数组。
  • source:要移动的轴的原始位置。
  • destination:要移动的轴的目标位置。
A = np.random.randint(0,100,(6,5,4))
A.T.shape
# 5 4 6
np.moveaxis(np.moveaxis(A,0,-1),0,1).shape

4.4 轴交换

moveaxis 不同的是,swapaxes 可以用来交换数组的轴。其方法如下:

numpy.swapaxes(a, axis1, axis2) 

其中:

  • a:数组。
  • axis1:需要交换的轴 1 位置。
  • axis2:需要与轴 1 交换位置的轴 1 位置。

举个例子:

B = np.random.randint(0,100,(7,6,5,4))
B.T.shape
#6 5 4 => 4 5 6
np.swapaxes(np.swapaxes(B,0,-1),1,2).shape

4.5 数组转置

transpose 类似于矩阵的转置,它可以将 2 维数组的水平轴和垂直交换。其方法如下:

numpy.transpose(a, axes=None)  

其中:

  • a:数组。
  • axis:该值默认为 none,表示转置。如果有值,那么则按照值替换轴。
B.transpose().shape
B.T.shape

广播机制

#和list对比
[[1,2,3],[4,5,6]]*3
#数组中的每个元素都乘以三,在语言特性中,这就是广播机制
np.array([[1,2,3],[4,5,6,]])*3

4.6数组’循环’

数组元素的循环

tilerepeat

np.tile([[1,2,3],[4,5,6]],3)
np.repeat([[2,1,3],[4,5,6]],3,axis=0)

五、ndarray的矩阵操作

1. 基本矩阵操作

  1. 算术运算符:
  • 加减乘除
A = np.ones(shape=(5,4),dtype='int8')
B = np.full(shape=(5,4),fill_value=2,dtype='int8')

np.add() 求和

np.add(A,B)

np.subtract()相减

np.subtract(B,A)

np.multiply() 乘积

np.multiply(A,B)

np.divide()相除

np.divide(A,B)

矩阵的点积 np.dot()

#4*5 x 5*4 = 4*4 
np.dot(A.T,B)
  

矩阵和向量之间的运算

#维克托 LOL三只手
#吃鸡  短剑 25
vector = [1,2,3,4,5]
A.shape
np.add(A.T,vector)
#矩阵乘以向量会降维
np.dot(A.T,vector)

三维张量和矩阵之间的点积

C = np.random.randint(0,150,(6,5,4))
A.shape
#当前张量中一共有6个矩阵
#张量和矩阵的运算 相当于  把每一个矩阵和A.T矩阵做一个点积
np.dot(C,A.T)

三维张量和向量运算

plt.imshow(np.dot(cat,[.3,.6,.1]),cmap='gray')

六、ndarray的排序(数据结构与算法栏目有详解)

冒泡,选择,插入,希尔,堆,归并,快速,基数
反面意义的:冒泡,选择,复杂度高 O(n^2)
正面意义的:快速,堆,归并 O(n*log2(n))

n = 1000000
n*np.log2(n),n**2

#选择排序
#反复的从一些没有排序的数列中取出最小的元素,放到另一个数列中的
arr = np.random.randint(0,20,10)
arr

arrcopy = np.zeros(shape=arr.shape[0])
#首先循环10for i in np.arange(arr.shape[0]):
    index = np.argmin(arr[i:])
    arr[i],arr[index+i] = arr[index+i],arr[i]
    arrcopy[i] = arr[i]

arr

arrcopy

#冒泡排序  
#shuffle洗牌
np.random.shuffle(arr)
arr

#冒泡排序是两个数组之间进行对比
for i in np.arange(arr.shape[0]-1):
    for j in np.arange(arr.shape[0]-1-i):
        if arr[j]>arr[j+1]:
            arr[j],arr[j+1] = arr[j+1],arr[j]
arr

1. '快速’排序

np.sort()与ndarray.sort()都可以,但有区别:
  
  - np.sort()不改变输入
  - ndarray.sort()本地处理,不占用空间,但改变输入

图解算法+图解数据结构

array = np.random.randint(0,20,10)
array

#利用递归法 需要定义函数
#left=0  right=9
#什么时候递归不用继续,start=end
#O(n*log2(n))
def quickSort(arr=None,start=0,end=0):
    #0 < 9
    if start < end:
        i,j = start,end
        #i,j=0,9
        #设置一个阈值
        #[10,  2,  9, 11, 17,  7,  9,  1,  9, 12]
        #base = arr[0] = 10
        base = arr[i]
        
        #0 < 9
        #3 < 8
        #4 < 7
        #6 < 6 不成立
        while i<j:
            
            #小的放左边  大的放右边
            #0<9 and 12>=10
            #0<8 and 9>=10  不成立
            #3<8 and 11>=10
            #3<7 and 1>=10  不成立
            #4<7 and 17>=10 
            #4<6 and 9>=10  不成立
            while (i<j) and (arr[j]>=base):
                j -= 1
            #[9,  2,  9, 1, 7,  7,  9,  17,  11, 12]
            arr[i] = arr[j]
            
            #0<8 and 9<=10
            #1<8 and 2<=10
            #2<8 and 9<=10
            #3<8 and 11<=10 不成立
            #3<7 and 1<=10
            #4<7 and 17<=10 不成立
            #4<6 and 7 <=10
            #5<6 and 7<=10
            #6<6         不成立
            while (i<j) and (arr[i]<=base):
                i += 1
            #[9,  2,  9, 1, 7,  7,  9,  17,  11, 12]
            arr[j] = arr[i]
        #[9,  2,  9, 1, 7,  9,  10,  17,  11, 12]
        #arr[i=6] = base=10
        arr[i] = base
            
        #左边的
        quickSort(arr,start,i-1)
        quickSort(arr,j+1,end)
        
quickSort(array,0,array.size-1)
array

#kind : {
   'quicksort', 'mergesort', 'heapsort',
#快速,归并,堆
np.sort(array)

2. 部分排序

np.partition(a,k)

有的时候我们不是对全部数据感兴趣,我们可能只对最小或最大的一部分感兴趣。

- 当k为正时,我们想要得到最小的k个数
- 当k为负时,我们想要得到最大的k个数

```java
Big_Array = np.random.randint(0,10000,10000)

#QPython 手机也可以写代码
#获取最小的5个元素
np.partition(Big_Array,kth=5)[:100]

#获取最大的5个元素
np.partition(Big_Array,kth=-5)[::-1][:100]