>>> import numpy as np
>>> a = np.array([[1,2,3,4],[2,3,4,5],[3,4,5,6]])
>>> a
array([[1, 2, 3, 4],
[2, 3, 4, 5],
[3, 4, 5, 6]])
>>> a.dtype
dtype('int32')
>>> a.shape
(3, 4)
还可以通过给a.shape赋值来修改数组的形状,如:
>>> a.shape = (4,-1) #这里的-1表示缺省参数,自动补齐
>>> a
array([[1, 2, 3],
[4, 2, 3],
[4, 5, 3],
[4, 5, 6]])
我们发现这只是改变了每个维度尺寸的大小,而数组元素的位置并没有发生改变,即将形状(3,4)变为(4,3)并不等同于将原数组转置。
还可以使用reshape函数来创建一个改变了原始数组形状的新数组,原始数组不变,但是新数组和原始数组共享内存区域,因此当修改了其中任意一个数组的元素时,另一个数组中对应于该位置的元素也相应的被修改了:
>>> b = a.reshape(2,-1)
>>> b
array([[1, 2, 3, 4, 2, 3],
[4, 5, 3, 4, 5, 6]])
>>> b[0,0] = 0
>>> b
array([[0, 2, 3, 4, 2, 3],
[4, 5, 3, 4, 5, 6]])
>>> a
array([[0, 2, 3],
[4, 2, 3],
[4, 5, 3],
[4, 5, 6]])
除了显式的给数组的每一个元素赋值来创建数组以外,还有其他几种创建数组的方式:
>>> c = np.arange(0,1,0.1)
>>> c
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
>>> d = np.linspace(0,1,10) #创建起点为0,终点为1,长度为10的等差数组
>>> d
array([ 0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,
0.55555556, 0.66666667, 0.77777778, 0.88888889, 1. ])
>>> e = np.logspace(0,10,10) #创建起点为10^0,终点为10^10,长度为10的等比数组
>>> e
array([ 1.00000000e+00, 1.29154967e+01, 1.66810054e+02,
2.15443469e+03, 2.78255940e+04, 3.59381366e+05,
4.64158883e+06, 5.99484250e+07, 7.74263683e+08,
1.00000000e+10])
>>> f = np.zeros(3,6)
>>> f
array([[ 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0.]])
>>> g = np.empty(2, 3, 2) #创建一个没有使用特定值来初始化的数组
>>> g
array([[[ 4.94065646e-324, 4.94065646e-324],
[ 3.87491056e-297, 2.46845796e-130],
[ 4.94065646e-324, 4.94065646e-324]],
[[ 1.90723115e+083, 5.73293533e-053],
[ -2.33568637e+124, -6.70608105e-012],
[ 4.42786966e+160, 1.27100354e+025]]])
astype显式的把一个数组的dtype转换或投射到另外的类型:
>>> arr = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1])
>>> arr
array([ 3.7, -1.2, -2.6, 0.5, 12.9, 10.1])
>>> arr.astype(np.int32) #把浮点数转换到整形dtype,小数部分将会被截断
array([ 3, -1, -2, 0, 12, 10], dtype=int32)
>>> numeric_strings = np.array(['1.25', '-9.6', '42'], dtype=np.string_)
>>> numeric_strings.astype(float) #一个字符窜数组表示的数字,可以使用 astype 把它们转换到数字的形式
array([ 1.25, -9.6 , 42. ])
与Python列表相似的是,ndarray也可以通过元素下标范围来获取新的数组,但是与列表不同的是,新数组与原始数组共享数据空间,因此当修改了其中任意一个数组的元素时,另一个数组中对应于该位置的元素也相应的被修改了。
>>> a = np.arange(0,10,2)
>>> a
array([0, 2, 4, 6, 8])
>>> b = a[1:-1:2]
>>> b
array([2, 6])
>>> b[0] = 3
>>> b
array([3, 6])
>>> a
array([0, 3, 4, 6, 8])
当使用列表或者数组的形式(统称为整数序列)来读取原数组元素来创建新数组时,两个数组就不会共享数据空间:
>>> a = np.arange(0,10,2)
>>> a
array([0, 2, 4, 6, 8])
>>> b = a[[4,3,2]] #列表形式
>>> b
array([8, 6, 4])
>>> b [0] = 10
>>> a
array([0, 2, 4, 6, 8])
>>> c = a[np.array([4,3,2])] #数组形式
>>> c
array([8, 6, 4])
>>> c [0] = 10
>>> a
array([0, 2, 4, 6, 8])
也可以使用布尔数组或者布尔列表来读取原始数组元素。当使用布尔数组时,只读取True在原始数组中对应位置的元素,而使用布尔列表时,True则代表1,False代表0,也就是分别读取原始数组位置为1和0的元素:
>>> a = np.arange(0,10,2)
>>> a
array([0, 2, 4, 6, 8])
>>> b = a[np.array([True,True,False,False,True])] #布尔数组
>>> b
array([0, 2, 8])
>>> c = a[[True,True,False,False,True]] #布尔列表
>>> c
array([2, 2, 0, 0, 2])
同样的,这样创建的新数组也不与原始数组共享数据空间。
多维数组即包含有多个维度,它的下标由多个数字来表示,它的存取方式和一维数组的类似。
下面就是一个多维数组的创建:
>>> np.arange(0,30,10).reshape(-1,1)+np.arange(0,3)
array([[ 0, 1, 2],
[10, 11, 12],
[20, 21, 22]])
在多维数组中,如果你省略了后面的索引,返回的对象将会是一个较低维的ndarray,它包括较高维度的所有数据。
>>> arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
>>> arr3d
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
>>> arr3d[0]
array([[1, 2, 3],
[4, 5, 6]])
>>> persontype = np.dtype({
'names':['name', 'age', 'weight'],
'formats':['S32','i', 'f']})
实际上就是先创建一个dtype对象persontype,通过其字典参数描述结构类型的各个字段。字典有两个关键字:names,formats(实际上可有names, formats, offsets, titles 四个关键字)。每个关键字对应的值都是一个列表。names定义结构中的每个字段名,而formats则定义每个字段的类型:
- S32 : 32个字节的字符串类型,由于结构中的每个元素的大小必须固定,因此需要指定字符串的长度
- i : 32bit的整数类型,相当于np.int32
- f : 32bit的单精度浮点数类型,相当于np.float32
然后我们调用array函数创建数组,通过关键字参数 dtype=persontype, 指定所创建的数组的元素类型为结构persontype。
>>> a = np.array([("Zhang",32,75.5),("Wang",24,65.2)],
dtype=persontype)
>>> a[0]
('Zhang', 32, 75.5)
>>> a[0].dtype
dtype([('name', '|S32'), ('age', '), ('weight', ')])
结构像字典一样可以通过字符串下标获取其对应的字段值:
>>> a[0]["name"]
'Zhang'
我们也可以直接获得结构数组的字段,它返回的是原始数组的视图,因此可以通过修改b[0]改变a[0][“age”]:
>>> b=a[:]["age"] # 或者a["age"]
>>> b
array([32, 24])
>>> b[0] = 40
>>> a[0]["age"]
40
T,二维数组的转置
>>> arr = np.arange(15).reshape((3, 5))
>>> arr
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> arr.T
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
transpose,对于多维数组,可以接受用于转置的坐标轴的号码的一个元组:
>>> arr = np.arange(16).reshape((2, 2, 4))
>>> arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
>>> arr.transpose((1, 0, 2))
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])