import numpy as np
list1 = [
[ [1,2,3],
[3,2,1]],
[ [4,5,6],
[6,5,4]],
[ [7,8,9],
[9,8,7]]]
arr1 = np.array(list1)
(一)数组切片与列表方式切片的区别:
print(arr1[1,:,1:3])
数组切片:
[[5 6]
[5 4]]
print(arr1[1][:][1:3])
列表方式:
[[6 5 4]]
(二)数组切片用法:
切第二行的元素
print(arr1[1,:,:])
print(arr1[1])
print(arr1[1,:,1:3])
[[5 6]
[5 4]]
赋值列表
import numpy as np
arr1 = np.random.randint(1,9,(3,4))
arr1[:,::2] = [100,100]
print(arr1)
[[100 6 100 2]
[100 6 100 1]
[100 3 100 5]]
赋值数组
import numpy as np
arr1 = np.random.randint(1,9,(3,12))
arr1[:,::2] = np.array([100,100,100,100,100,100])
print(arr1)
[[100 4 100 3 100 5 100 7 100 8 100 8]
[100 2 100 1 100 3 100 8 100 3 100 1]
[100 6 100 1 100 1 100 6 100 8 100 2]]
1、当数组的 ndim 比较高或者ndim 不确定时,我们使用切片可以使用 ... 来代替其他维度所有内容
eg:array[0:405,0:405,...] ---- 切片取出 前405行,前405列其他维度所有的数据
eg:array[...,3:10] ---- 切片,前面的维度都要,仅仅在最后一个维度切 3-9
arr1 = [1,2,3,4]
arr2 = arr[::-1] # arr2 = [4,3,2,1]
arr2 = arr[::-2] # arr2 = [4,2] # 数组颠倒,步长为2
注意 内部函数 .ix_( 索引数组1,索引数组2 ) 的用法。
也可用转置( .T )来取与 .ix_()方法一样的结果。
import numpy as np
arr1 = np.arange(1,31,1).reshape(6,5)
print(arr1)
# 获得第 2 4 5 行的所有元素
====================================== 取多行数据 =======
print(arr1[[1,3,4]]) ----- 这里要区分 与 print(arr1[1,3,4]) 的区别
=======================================================================
# 注意这里取的是 (1,1) (3,2) (4,4) 四个元素
print(arr1[[1,3,4],[1,2,4]])
==================================== np.ix_()用法 =======================
# 取得时是所有 第 2 4 5 行 与 1,2,4列的元素。 用 内部函数 np.ix_( 索引数组1,索引数组2 )
print(arr1[np.ix_([1,3,4],[1,2,4])])
# 也可以用转置 来取,与 np.ix_( )结果相同。
print(arr1[[1,3,4]].T[[1,2,4]].T)
实例用法:
①
求数组 数 > 5 的所有数。
import numpy as np
arr1 = np.arange(1,11,1).reshape(2,5)
# [[ 1 2 3 4 5]
# [ 6 7 8 9 10]]
print(arr1 > 5)
# [[False False False False False]
# [ True True True True True]]
print(arr1[arr1 > 5])
# [ 6 7 8 9 10]
②
names = np.array(['joe','tom','anne'])
scores = np.array([[70,80,90],
[77,88,91],
[80,90,70]])
classes = np.array(['语文','数学','英语'])
# 输出 joe 的成绩
bool_1 = names == 'joe'
print(bool_1) [ True False False]
print(scores[bool_1]) # [[70 80 90]]
# 输出joe的数学成绩
bool_2 = classes == '数学'
print(bool_2) [False True False]
print(scores[bool_1,bool_2]) # [80]
# 第三题
print(scores[(names == 'joe')|(names == 'anne')])
# [[70 80 90]
# [80 90 70]]
#第四题
print(scores[(names != 'joe') & (names != 'anne')]) # [[77 88 91]]
import numpy as np
arr1 = np.arange(1,11,1).reshape(2,5)
1、 利用 T 属性
arr2 = arr1.T
print(arr2)
2、利用 transpose()函数
arr3 = arr1.transpose()
print(arr3)
import numpy as np
arr1 = np.arange(1,13,1).reshape(2,3,2)
arr2 = arr1.transpose(2,0,1) 中间不用加小()
print(arr2)
[[[ 1 3 5]
[ 7 9 11]]
[[ 2 4 6]
[ 8 10 12]]]
运行过程:
可以将数组A进行拉伸,沿着A的维度重复rep次
例子:
import numpy as np
arr1 = np.array([[1,2,3],
[4,5,6]])
print(np.tile(arr1,3)) # 一个数字为 横向拉伸 3 倍
print(np.tile(arr1,(3,2))) # 纵向 拉伸 3倍 ,横向拉伸 2倍
print(np.tile(arr1,(3,2,1))) # 0轴 拉伸 3倍 ,1轴 拉伸 2倍,2轴拉伸 1倍
对于ndarray数组而言,多个数组可以执行合并操作,合并的方式有多种:
import numpy as np
a = np.array([[1,2,3],
[4,5,6]])
b = np.array([[1,2,3],
[4,5,6]])
c = np.array([[1,2,3],
[4,5,6]])
d = np.array([[1,2,3],
[4,5,6]])
e = np.array([1,2,3])
f = np.array([4,5,6])
print(np.stack((e,))) # 注意 : stack 里面要用小()括起来,默认 axis 为 0 轴。
print(np.stack((e,),axis=1))
print(np.stack((e,f),axis=1))
ufunc:接受一个或多个标量值,进行快速元素级运算的函数,主要包括一元函数和二元函数。
元素级操作,调用方法: np . 函数名()。
例子:
arr23 = np.arange(6).reshape((2, 3))
print(arr23)
print(arr23.sum(axis=0))
print(arr23.mean())
print(np.average(range(1,11), weights=range(10,0,-1))) # 加权均值
print(arr23.std())
print(arr23.var()) # 方差
print(arr23.argmax(axis=0))
print(arr23.argmin(axis=1))
print(arr23.cumsum())
answer:
[[0 1 2]
[3 4 5]]
[3 5 7]
2.5
1.707825127659933
2.9166666666666665
[1 1 1]
[0 0]
[ 0 1 3 6 10 15]
arr21 = np.ndarry([2,3,4])
print(np.tile(arr21, 5)) ------ [2 3 4 2 3 4 2 3 4 2 3 4 2 3 4]
print(np.repeat(arr21, [3, 2, 1])) ------- [2 2 2 3 3 4]
arr23 = np.arange(6).reshape((2, 3))
print(arr23)
print(np.repeat(arr23, 2, axis=1))
print(np.repeat(arr23, 2, axis=0))
print(np.tile(arr23, 2))
print(np.tile(arr23, 2))
[[0 1 2]
[3 4 5]]
[[0 0 1 1 2 2]
[3 3 4 4 5 5]]
[[0 1 2]
[0 1 2]
[3 4 5]
[3 4 5]]
[[0 1 2 0 1 2]
[3 4 5 3 4 5]]
[[0 1 2 0 1 2]
[3 4 5 3 4 5]]
np.where(condition,arr1,arr2) 满足条件 选择arr1,不满足 选择arr2
用法:
# 几个重要函数
arr22 = np.array([3, 4, 2, 1, 1, 3, 2, 4])
print(np.unique(arr22))
[1 2 3 4]
arr21 = np.array([4, 3, 2])
print(sorted(arr21)) # 返回临时排序的列表
print(arr21) # 原数组
print(arr21.argsort()) # 排序后的初始下标
[2, 3, 4]
[4 3 2]
[2 1 0]
arr21.sort() # 不返回值,只进行排序操作
print(arr21) # 排序后数组
[2 3 4]
numpy API:
flattened
flip() (in module numpy)
fliplr() (in module numpy) # 二维数组 左右反转
flipud() (in module numpy)
1、数据对象.flat
2、数据对象.shape = (-1,)
3、数据对象.real()
4、数据对象.reshape(-1)
print(a3.ravel()) # 不改变源数据
print(a3.flatten("C"))
print(a3.flatten("F"))
arr12 = np.array([True, True, False])
arr13 = np.array([True, True, True])
arr14 = np.array([False, False, False])
print(np.any(arr12))
print(np.any(arr14))
print(np.all(arr12))
print(np.all(arr13))
True
False
False
True
help(np.log) -------- 查看对数函数的用法
1.1、数组二进制存储:np.save()
1.2、数组二进制读取:np.load()
2.1、数组文本文件存储:
① np.savetxt() :
② np.genfromtxt() :
2.2、数组文本文件读取:np.loadtxt()
求矩阵的逆:
① numpy.linalg.inv(X) 前提:X 必须是一个 矩阵(matrix) 的数据类型
② xxx.I 前提:xxx 必须是一个 矩阵(matrix) 的数据类型
-------------------------------------------------------------------------------------------
# 求矩阵的逆
import numpy as np
a = [
[1],
[2]
]
a=np.mat(a) -------------- 生成一个矩阵的数据类型
print(type(a))
b=np.linalg.inv(a) ------------ 或者 b = a.I(前提:数据类型必须是matrix数据类型,不能使ndarray类型)
print(b)
求解:numpy.linalg.solve()
SVD矩阵分解: np.linalg.svd(二维数组)
eg: u,singma,v = np.linalg.svd(二维数组) ------ u,singma,v 接收分解后的三个矩阵。
numpy ndarray的数据类型:矩阵 A 矩阵 B
---------------------------------------------------------------------------------------
A*B >>>>>>> 对应元素相乘(元素级操作)
np.dot(A,B) >>>>>> 矩阵A与矩阵B的点积
=============================================================================================
numpy 矩阵(matrix)的数据类型:矩阵 A 矩阵 B
A*B >>>>>>> 直接结果就是 点积
A是矩阵数据类型,则 是 A的转置 * A
1、数据对象.flat
2、数据对象.shape = (-1,)
3、数据对象.real()
4、数据对象.reshape(-1)
numpy API:
flattened
flip() (in module numpy)
fliplr() (in module numpy) # 二维数组 左右反转
flipud() (in module numpy)
flip:
flip(m, 0) is equivalent to flipud(m).
flip(m, 1) is equivalent to fliplr(m).
flip(m, n) corresponds to m[...,::-1,...] with ::-1 at position n.
flip(m) corresponds to m[::-1,::-1,...,::-1] with ::-1 at all positions.
flip(m, (0, 1)) corresponds to m[::-1,::-1,...] with ::-1 at position 0 and position 1.
>>> A = np.arange(8).reshape((2,2,2))
>>> A
array([[[0, 1],
[2, 3]],
[[4, 5],
[6, 7]]])
>>> flip(A, 0)
array([[[4, 5],
[6, 7]],
[[0, 1],
[2, 3]]])
>>> flip(A, 1)
array([[[2, 3],
[0, 1]],
[[6, 7],
[4, 5]]])
>>> np.flip(A)
array([[[7, 6],
[5, 4]],
[[3, 2],
[1, 0]]])
>>> np.flip(A, (0, 2))
array([[[5, 4],
[7, 6]],
[[1, 0],
[3, 2]]])
>>> A = np.random.randn(3,4,5)
>>> np.all(flip(A,2) == A[:,:,::-1,...])
True
flipud: (==flip(m, 1) )
Flip array in the up/down direction.
Flip the entries in each column in the up/down direction. Rows are preserved, but appear in a different order than before.
Equivalent to m[::-1,...]. Does not require the array to be two-dimensional.
>>> A = np.diag([1.0, 2, 3])
>>> A
array([[ 1., 0., 0.],
[ 0., 2., 0.],
[ 0., 0., 3.]])
>>> np.flipud(A)
array([[ 0., 0., 3.],
[ 0., 2., 0.],
[ 1., 0., 0.]])
>>>
>>> A = np.random.randn(2,3,5)
>>> np.all(np.flipud(A) == A[::-1,...])
True
>>>
>>> np.flipud([1,2])
array([2, 1])
fliplr: (==flip(m, 0))
Equivalent to m[:,::-1]. Requires the array to be at least 2-D.
Flip array in the left/right direction.
rot90
Rotate array counterclockwise.
>>> A = np.diag([1.,2.,3.])
>>> A
array([[ 1., 0., 0.],
[ 0., 2., 0.],
[ 0., 0., 3.]])
>>> np.fliplr(A)
array([[ 0., 0., 1.],
[ 0., 2., 0.],
[ 3., 0., 0.]])
>>>
>>> A = np.random.randn(2,3,5)
>>> np.all(np.fliplr(A) == A[:,::-1,...])
True