Numpy学习
数组有几个非常重要的概念
1、维度Dimensions,叫作轴axes
2、轴的个数叫作秩rank
例:
[[0,0,0],
[0,0,0]]
ndarray.ndim = 2:数组轴的个数。二维数组
ndarray.shape = (2,3):数组的维度。(n,m)
ndarray.size = 6:数组元素总个数。n*m
ndarray.dtype = int64:数组元素数据类型。
ndarray.itemsize= 8:数组元素所占字节数。
ndarray.data:通常不用,通常用索引方法,用于读元素。
- 创建数组
import numpy as np
a = np.array([1,2,3])#[1,2,3]
b = np.zeros(2,3)
***
[[0,0,0],
[0,0,0]]
***
c = np.ones(2,3)
[[1,1,1],
[1,1,1]]
d = np.empty(2,3)#2行3列,值随机。
e = np.arange(10,30,5)#[10,15,20,25] 第三个参数是步长,从第一个参数开始,不包含第二个参数。
f = np.linspace(0,1,2)#[0,1]从第一个参数开始到第二个参数,一共第三个参数的个数。
- 基本运算
+,-,*,/,+=,-=,*=,/=,np.dot,np.min,np,max,np.sum
这+=,-=,*=,/=运算时,要注意up-cast问题
这np.min,np,max,np.sum运算时,要注意axis参数,表示在哪个轴上进行运算。
在深度学习时很少需要用到运算的,只作简单了解。
- 索引、切片和迭代(重要)
import numpy as np
a = np.arange(0,10,1)
#[0,1,2,3,4,5,6,7,8,9]
a[0:9:1]#第一个参数表示从什么位置9开始到第二参数9的位置,步长是1.返回[0,1,2,3,4,5,6,7,8]
如果参数不填表示默认值
如:
a[::-1]#[9,8,7,6,5,4,3,2,1,0]
b = np.array([[1,2,3],
[14,15,16],
[4,5,6]])
b[0,1] = 2
b[1,1] = 15
b[0:2,1] = [2,15]
b[:,1] = [2,15,5]
b[:,0:2]=[[1,2],
[14,15],
[4,5]]
b[-1]=[4,5,6]#最后一行,等价于b[-1,:]
c=np.array([[[1,2,3,],[4,5,6]],
[[7,8,9],[10,11,12]]])
c.shape#[2,2,3]
c[1,...] 等价于 c[1,:,:]]=[[7,8,9],[10,11,12]]
c[...,2] 等价于c[:,:,2]=[[3,6],[9,12]]! 我一直以为是[[[3],[6]],[[9],[12]]]?
d=np.arange(12) * 2
e=np.array([0,1,3])
d[e] = [0,2,6]#以数组作索引。
f=np.array([[1,2],[3,4]])
d[f]=[[1,4],[6,8]]
#以两个数组作为索引。
In [9]: a =np.arange(12).reshape(3,4)
In [10]: a
Out[10]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [11]: i=np.array([[0,1],[1,2]])
In [12]: i
Out[12]:
array([[0, 1],
[1, 2]])
In [13]: j=np.array([[2,1],[3,3]])
In [14]: j
Out[14]:
array([[2, 1],
[3, 3]])
In [15]: a[i,j]
Out[15]:
array([[ 2, 5],
[ 7, 11]])
In [16]: a[i]
Out[16]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]])
#以BOOL值作索引
In [21]: a =np.arange(12).reshape(3,4)
In [22]: a
Out[22]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [23]: b=a>4
In [24]: b
Out[24]:
array([[False, False, False, False],
[False, True, True, True],
[ True, True, True, True]])
In [25]: a[b]
Out[25]: array([ 5, 6, 7, 8, 9, 10, 11])
- 数组的变形
数组的形状可以用ndarray.shape查看
改变形状用ravel和reshape改变
ravel可以将数组打平
In [32]: a =np.arange(12).reshape(3,4)
In [33]: a.ravel()
Out[33]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
reshape可以改变每个轴的大小。当参数为-1时,则自动计算。
In [37]: a =np.arange(12).reshape(3,4)
In [38]: a.reshape(3,2,-1)
Out[38]:
array([[[ 0, 1],
[ 2, 3]],
[[ 4, 5],
[ 6, 7]],
[[ 8, 9],
[10, 11]]])
resize方法,功能和reshape一样,但是不会返回一个新的数组,会改变数组本身。
- 数组的组合和拆分
vstack 、hstack、column_stack组合函数。
vsplit、hsplit、split拆分函数
- 广播
注意reshape时扩充1个维度。
In [39]: x=np.arange(4)
In [40]: xx = x.reshape(4,1)
In [41]: y=np.ones(5)
In [42]: x+y
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-42-259706549f3d> in <module>
----> 1 x+y
ValueError: operands could not be broadcast together with shapes (4,) (5,)
In [43]: xx+y
Out[43]:
array([[1., 1., 1., 1., 1.],
[2., 2., 2., 2., 2.],
[3., 3., 3., 3., 3.],
[4., 4., 4., 4., 4.]])
In [44]: (xx+y).shape
Out[44]: (4, 5)