文章目录
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数组’循环’
数组元素的循环
tile
与 repeat
np.tile([[1,2,3],[4,5,6]],3)
np.repeat([[2,1,3],[4,5,6]],3,axis=0)
五、ndarray的矩阵操作
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])
#首先循环10次
for 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]