np.array()
,dtype
默认为float64
arr = np.array, arr.astype(np.int32)
,这一部操作是将float64转化为int32,且这个函数默认生成新数组np.zeros()
np.empty()
np.arange(15).reshape(3,5)
a = np.linspace(1,10,20).reshape(3,4)
,生成一个20段1-10的数列(拆成20个数字)数组之间每个元素的运算,这里的每个数组尺寸应该相同,不同数组涉及到广播的知识,这里暂不做解释。
np.sum(a, axis=1)
,np.min(a)
,np.max(a)
x = np.random.randn(8)
y = np.random.randn(8)
print(np.maximum(x, y))
remainder,whole_part = np.modf(arr)
np.dot(a,b)
或者a.dot(b)
,就不会是各个元素之间的乘法了。与列表相似,前闭后开,
与Python中列表的不同
arr = np.arange(10)
arr[5:9] = 12
print(arr)
##################################
a = range(10)
a[5:9] = 12
print(a)
上面的运算结果:
[ 0 1 2 3 4 12 12 12 12 9]
下面的运算结果
TypeError: 'range' object does not support item assignment
list 是不能全部赋值的
2.浅拷贝和深拷贝: python中赋值是直接产生一个新的对象,但是numpy赋值不是,只是一个原数列的视图。改变复制过的,原数组也会被改变
例子:
a = list(range(10))
c = a[5:8]
c[1] = 12
print(a)
b = np.arange(10)
d = b[5:8]
d[1] = 12
print(b)
运行结果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[ 0 1 2 3 4 5 12 7 8 9]
那如果想要实现拷贝应该怎样呢?arr[5:8].copy()
a = np.arange(1, 10).reshape(3, 3)
# 取a的前二行(前闭后开),后两列(前闭后开)
print(a)
print(a[:2, 1:])
运行结果
[[1 2 3]
[4 5 6]
[7 8 9]]
[[2 3]
[5 6]]
a = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = np.random.randn(7, 4)
print(data)
print(a == 'Bob')
print(data[a == 'Bob', :2])
# 下面两种方法是一样的
print(data[a != 'Bob', :2])
print(data[~(a == 'Bob'), :2])
运行结果
[[ 1.20241647 0.36663084 1.85073518 0.67903502]
[ 0.29870251 -1.0132424 0.11510327 -0.14303322]
[-1.40256722 1.75919835 -0.22010801 0.80810424]
[-0.71759139 2.44953776 -0.87907408 0.74139462]
[-1.26135595 -1.0156839 0.51825134 0.46750828]
[ 2.07459465 -1.66901302 0.48055465 0.37875228]
[-1.06639616 -0.21239745 -0.02350804 1.07777372]]
[ True False False True False False False]
[[ 1.20241647 0.36663084]
[-0.71759139 2.44953776]]
[[ 0.29870251 -1.0132424 ]
[-1.40256722 1.75919835]
[-1.26135595 -1.0156839 ]
[ 2.07459465 -1.66901302]
[-1.06639616 -0.21239745]]
[[ 0.29870251 -1.0132424 ]
[-1.40256722 1.75919835]
[-1.26135595 -1.0156839 ]
[ 2.07459465 -1.66901302]
[-1.06639616 -0.21239745]]
生成一个新的对象,跟切片不同,生成的不是一个视图对象。
arr = np.arange(32).reshape((8, 4))
# 取出(1,0),(5,3),(7,1),(2,2)的元素
print(arr[[1, 5, 7, 2], [0, 3, 1, 2]])
# 取出1,5,7,2行元素,再把列进行排列
print(arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]])
运行结果
[ 4 23 29 10]
[[ 4 7 5 6]
[20 23 21 22]
[28 31 29 30]
[ 8 11 9 10]]
m, n = (5, 3)
x = np.linspace(0, 1, m)
y = np.linspace(0, 1, n)
X, Y = np.meshgrid(x,y)
x
out:
array([ 0. , 0.25, 0.5 , 0.75, 1. ])
y
out:
array([ 0. , 0.5, 1. ])
X
out:
array([[ 0. , 0.25, 0.5 , 0.75, 1. ],
[ 0. , 0.25, 0.5 , 0.75, 1. ],
[ 0. , 0.25, 0.5 , 0.75, 1. ]])
Y
out:
array([[ 0. , 0. , 0. , 0. , 0. ],
[ 0.5, 0.5, 0.5, 0.5, 0.5],
[ 1. , 1. , 1. , 1. , 1. ]])
X就是横着摆,复制y的维度那么多倍
y就是竖着摆,复制x的维度那么多倍
条件1:np.where(a,b,c)
a : 里面是参数,对应的元素是True
b:里面是True对应应该选择的数,c里面是False选择的数
np.mean(arr)
,np.sum(arr)
,可选参数axis
cumsum理解
例子:
a = np.array([[1, 2, 3], [4, 5, 6]])
print(np.cumsum(a))
print(np.cumsum(a, axis=0))
print(np.cumsum(a, axis=1))
###################运行结果##################
[ 1 3 6 10 15 21]
#array([1,1+2=3,1+2+3=6,1+2+3+4=10,1+2+3+4+5=15,1+2+3+4+5+6=21])
[[1 2 3]
[5 7 9]]
#[1, 2, 3]
#[1+4=5,2+5=7,3+6=9]
[[ 1 3 6]
[ 4 9 15]]
计算正值的个数
arr = np.random.randn(100)
print((arr > 0).sum())
排序是新产生一个对象,函数本身不
arr.sort(1)
:每一行按照从小到大进行排序
arr.sort()
:每一列按照从小到大进行排序
方法 | 描述 |
---|---|
unique(x) | 计算x的唯一值,并排序 |
intersect1d(x,y) | 计算x和y的交集,并排序 |
union1d(x,y) | 计算x和y的并集,并排序 |
in1d(x,y) | 计算x中的元素是否包含在y中,返回一个布尔数值 |
setdiff1d(x,y) | 差集,在x中但不在y中的x的元素 |
setxor1d(x,y) | 异或集,在x或者y中,但不属于x,y交集的元素 |
数组的合并操作
np.vstack((A,B))
:纵向合并
np.hstack((A,B))
:横向合并
数组的array分割
np.split(A,3,axis=0)
:将A分成3行
np.split(A,4,axis=1)
:将A分成四列
进行不等项分割:np.array_split()
矩阵运算用linalg运算:书籍228页
np.random.normal(size=(4,4))
np.random.random((2,4))
区分一下,如果不写,那么生成的就是均值为4方差为4的一个值。