首先是numpy中数组–ndarray类,需要注意的是数组与列表最大的一个不同点是:数组的数据类型基本上都是一个,而列表每个元素的数据类型都可以不同。
ndarray的属性:
ndarray是一个多维数组对象,包括了两部分:实际存储的数据和数组的属性,数组的属性包括了:数组的秩、数组的尺度、数组元素的个数、数组元素类型、每个元素的大小。
属性的名称 | 作用/意义 |
---|---|
a.ndim | 数据的维数 |
a.shape | 数组的形状(比如矩阵几行几列) |
a.size | 元素的个数 |
a.dtype | 元素的种类 |
a.itemsize | 元素的大小(字节) |
下列出ndarray中允许的数据类型(numpy自带)
ndarray的创建:
1、通过已有的列表、元组来创建:
Ex:
mlist=[1,1,1,1]
a=np.array(mlist)
print('a',a)
mtuple=[2,2,2,2]
b=np.array(mtuple)
print('b',b)
结果:
a [1 1 1 1]
b [2 2 2 2]
注:
1、这里a和b都是numpy.ndarray类。
2、此外array函数可以改变元素的数据类型:array(list/tuple,dtype=…)
3、numpy中还有另外一个函数.tolist()可以将数组转化为列表
2、一些常用创建函数(与matlab类似)
Ex:
import numpy as np
a=np.arange(10)
print('a',a)
b=np.ones((3,2))
print('b',b) # zeros与之类似
c=np.full((3,2),2)
print('c',c)
d=np.eye(3)
print('d',d)
结果:
a [0 1 2 3 4 5 6 7 8 9]
b [[1. 1.]
[1. 1.]
[1. 1.]]
c [[2 2]
[2 2]
[2 2]]
d [[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
3、通过数组创建
Ex:
import numpy as np
a = np.array([[1, 2, 3], [1, 2, 3], [1, 2, 3]])
b = np.ones_like(a)
c = np.full_like(a, 3)
print('b', b)
print('c', c)
结果:
b [[1 1 1]
[1 1 1]
[1 1 1]]
c [[3 3 3]
[3 3 3]
[3 3 3]]
Ex:
import numpy as np
a = np.linspace(1,10,4)
b = np.linspace(1,10,4,endpoint = False)
c = np.concatenate((a,b))
print('a', a)
print('b', b)
print('c', c)`
结果:
a [ 1. 4. 7. 10.]
b [1. 3.25 5.5 7.75]
c [ 1. 4. 7. 10. 1. 3.25 5.5 7.75]
注:linspace(a,b,c)的作用是将(a,b)区间分成c-1份,数组内为c个边界点,如果加入endpoint=False则不包括b点 将区间c等分,数组内为前c个点
4、重组数组:
Ex:
import numpy as np
a = np.ones((2, 3, 4))
print('a', a)
b = a.reshape((3, 8))
print('b', b)
print('a', a)
a.resize((3, 8))
print('a', a)
e = a.flatten()
print('e', e)
结果:
a [[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]]
b [[1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1.]]
a [[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]]
a [[1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1.]]
e [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
注:reshape返回的是一个重组后的数组,而resize则是将原数组进行重组,返回值为None;
5、转化数据类型:atype函数
Ex:
import numpy as np
a = np.ones((2, 3, 4),dtype = int)
print('a', a)
b = a.astype(dtype = float)
print('b', b)
结果:
a [[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]]
b [[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]]
注:
1、如果dtype选择与原有的形式相同,则相当于进行了一次拷贝。
2、这里dtype选择的类型直接为int和float,但具体是多少位的由程序“自己选择”。
ndarray数组的索引和切片
ndarray数组的索引和切片与python中列表的操作相似,下直接用例子来说明:
Ex
import numpy as np
a = np.arange(30)
a.resize((2,3,5))
print('1、',a)
print('2、',a[0,0,0]) # 索引时不同维度用‘,’隔开
print('3、',a[:,:,:]) # 切片时‘:’表示的是整个维度 如果选择一部分则用a:b的形式代替(不包括b)
print('4、',a[:,:,::2]) # 切片时,如果使用‘::’的形式,则a:b:c的含义为,a,b以c的间隔大小进行切片
结果:
1、 [[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
[[15 16 17 18 19]
[20 21 22 23 24]
[25 26 27 28 29]]]
2、 0
3、 [[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
[[15 16 17 18 19]
[20 21 22 23 24]
[25 26 27 28 29]]]
4、 [[[ 0 2 4]
[ 5 7 9]
[10 12 14]]
[[15 17 19]
[20 22 24]
[25 27 29]]]
注:
1、切片时,a:b不包括b,且注意与列表相似,数组元素从0开始数
2、数组一样可以用负数来索引和切片,-1表示维度中最后一个
ndarray数组的运算
数组的运算本质上是数组元素的运算,下列出一部分常用的运算之后使用: