Numpy学习-1
数组基础
-
创建数组
1 .一维数组的创建
#导入模块
import numpy as np
#使用array()函数创建数组,array的首个参数一定是一个序列,可以是元组也可以是列表。
ls1 = range(10)
list(ls1)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
type(ls1)
range
#使用numpy中的arange()函数创建一维有序数组
ls2 = np.arange(10)
list(ls2)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
type(ls2)
numpy.ndarray
从上看出:使用array()函数创建数组,array的首个参数一定是一个序列,可以是元组也可以是列表。
#使用arrray()函数创建数组----由元组序列构成的一维数组
arr1 = np.array((1,20,13,28,22))
arr1
array([ 1, 20, 13, 28, 22])
#使用arrray()函数创建数组----由列表序列构成的一维数组
arr2 = np.array([1,1,2,3,5])
arr2
array([1, 1, 2, 3, 5])
2.二维数组的创建
#使用元组套元组的方式
arr3 = np.array(((1,1,2,3),(5,8,13,21),(34,55,89,144)))
arr3
array([[ 1, 1, 2, 3],
[ 5, 8, 13, 21],
[ 34, 55, 89, 144]])
#使用列表套列表的方式
arr4 = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
arr4
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
3 .numpy提供的几种特殊数组
#返回一维数组全为1的数组
np.ones(3)
array([ 1., 1., 1.])
#返回元素全为1的3X4二维数组
np.ones([3,4])
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
#返回元素全为0的3X4二维数组
np.zeros([3,4])
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
- 有关数组的属性和函数
1 .属性(方法)
#直接数组名称查看
#shape方法返回数组的行数和列数
arr3.shape #此处没有(),否则报错
(3, 4)
#dtype方法返回数组的数据类型
arr3.dtype
dtype('int32')
#通过ravel的方法将数组拉直(多维数组将为一维数组)
a = arr3.ravel()
a
array([ 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144])
#通过flatten方法将数组拉直
b = arr3.flatten()
b
array([ 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144])
两者的区别在于ravel方法生成的是原数组的视图,无需占有内存空间,但视图的改变会影响到原数组的变化。而flatten方法返回的是真实值,其值的改变并不会影响原数组的更改。
#例子:
b[:3]=0
arr3
array([[ 1, 1, 2, 3],
[ 5, 8, 13, 21],
[ 34, 55, 89, 144]])
a[:3]=0
arr3
array([[ 0, 0, 0, 3],
[ 5, 8, 13, 21],
[ 34, 55, 89, 144]])
arr4.ndim #返回数组的维数
2
arr4.size #返回数组元素的个数
12
arr4.T #返回数组的转置结果
array([[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11],
[ 4, 8, 12]])
如果数组的数据类型为复数的话,real方法可以返回复数的实部,imag方法返回复数的虚部。
2.函数
len(arr4) #返回数组有多少行
3
np.hstack((arr3,arr4)) #横向拼接arr3和arr4两个数组,但必须满足两个数组的行数相同
array([[ 0, 0, 0, 3, 1, 2, 3, 4],
[ 5, 8, 13, 21, 5, 6, 7, 8],
[ 34, 55, 89, 144, 9, 10, 11, 12]])
np.vstack((arr3,arr4)) #纵向拼接
array([[ 0, 0, 0, 3],
[ 5, 8, 13, 21],
[ 34, 55, 89, 144],
[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
np.column_stack((arr3,arr4)) #与hstack函数具有一样的效果
array([[ 0, 0, 0, 3, 1, 2, 3, 4],
[ 5, 8, 13, 21, 5, 6, 7, 8],
[ 34, 55, 89, 144, 9, 10, 11, 12]])
np.row_stack((arr3,arr4)) #与vstack函数具有一样的效果
array([[ 0, 0, 0, 3],
[ 5, 8, 13, 21],
[ 34, 55, 89, 144],
[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
reshape()函数和resize()函数可以重新设置数组的行数和列数:
arr5 =np.array(np.arange(24))
arr5 #此为一维数组
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])
a = arr5.reshape(4,6) #reshape函数
a
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
a.resize(6,4) #resize()函数
a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]])
#tolist将数组转换为列表
b=a.tolist()
type(b) #'list' object has no attribute 'dtype'
list
#astype()强制转换数组的数据类型
c = a.astype(float)
print("a数组的数据类型是%s" %a.dtype ,
"c数组的数据类型是%s" %c.dtype)
a数组的数据类型是int32 c数组的数据类型是float64
- .数组元素的获取
通过索引和切片的方式获取数组元素
1 . 一维数组元素的获取
arr7 = np.array(np.arange(10))
arr7
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#获取第4个元素
arr7[3]
3
#获取前3个元素
arr7[:3]
array([0, 1, 2])
#获取第4个元素之后的所有元素
arr7[3:]
array([3, 4, 5, 6, 7, 8, 9])
#获取末尾的2个元素
arr7[-2:]
array([8, 9])
#从第1个元素开始,获取步长为2的所有元素
arr7[::2]
array([0, 2, 4, 6, 8])
2.二维数组元素的获取
arr8 = np.array(np.arange(12)).reshape(3,4)
arr8
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
arr8[:2] #返回数组的前2行
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
#返回指定的第1行和第3行
arr8[[0,2]]
array([[ 0, 1, 2, 3],
[ 8, 9, 10, 11]])
arr8[:,-2:] #返回数组 的后2列
array([[ 2, 3],
[ 6, 7],
[10, 11]])
#返回数组的第1列和第3列
arr8[:,[0,2]]
array([[ 0, 2],
[ 4, 6],
[ 8, 10]])
#返回数组中第2行第3列对应的元素
arr8[1,2]
6
布尔索引,即索引值为True和False,需要注意的是布尔索引必须输数组对象。
log = np.array([True,False,True]) #返回所有为True的对应行
arr8[log]
array([[ 0, 1, 2, 3],
[ 8, 9, 10, 11]])
arr8[-log] #通过符号筛选出所有为False的对应行
E:\anaconda\lib\site-packages\ipykernel\__main__.py:1: DeprecationWarning: numpy boolean negative, the `-` operator, is deprecated, use the `~` operator or the logical_not function instead.
if __name__ == '__main__':
array([[4, 5, 6, 7]])
#举个例子:
area = np.array(['A','B','A','C','A','B','D'])
area
observes = np.array(np.arange(21)).reshape(7,3)
observes
observes[area == 'A'] #返回所有为'A'的观测
array([[ 0, 1, 2],
[ 6, 7, 8],
[12, 13, 14]])
#条件值需要在&(and),|(or)两端用圆括号括起来
observes[(area == 'A') | (area == 'D')]
array([[ 0, 1, 2],
[ 6, 7, 8],
[12, 13, 14],
[18, 19, 20]])
#布尔索引也可以与普通索引或切片混合使用:
observes[area == 'A'][:,[0,2]] #返回A区域的所有行,且只获取第1列与第3列数据。
array([[ 0, 2],
[ 6, 8],
[12, 14]])
花式索引:将数组作为索引将原数组的元素提取出来
arr8[[2,1]] #按照指定顺序返回指定行
array([[ 8, 9, 10, 11],
[ 4, 5, 6, 7]])
arr8[[2,1]][:,[0,2]] #返回指定的行与列
array([[ 8, 10],
[ 4, 6]])
#使用比较简单的方式返回指定行以列的二维数组的话,可以使用ix_()函数
arr8[np.ix_([2,1],[0,2])]
array([[ 8, 10],
[ 4, 6]])