Numpy
1.数组的创建
(1) np.array()
(2) np.asarray()
array和asarray都能将数据转换为ndarray,当输入的数据是列表,元组等非ndarray型时,两者的功能相同,都是原数据的复制。
如果原数据是ndarray,array函数默认复制原数据,而asarray则不复制,直接指向原数据或者说和原数据相同。
import numpy as np
a=np.ones((3,3))
b=np.array(a)
c=np.asarray(a)
b is a # false
c is a # True
a[1][1]=0
a
'''
array([[1., 1., 1.],
[1., 0., 1.],
[1., 1., 1.]])
'''
b
'''
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
'''
c
'''
array([[1., 1., 1.],
[1., 0., 1.],
[1., 1., 1.]])
'''
#因为a和c指向同一个对象,所以当a发生变化时,c也发生变化
(3) np.zero() 产生指定长度和形状的float型全0的数组
np.zeros(10) #array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.zeros((2,3))
'''
array([[0., 0., 0.],
[0., 0., 0.]])
'''
np.empty(10) #array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.empty((2,3,4))
'''
array([[[ 8.90104239e-307, 1.89144180e-307, 9.34572443e-307,
3.56039997e-307],
[ 4.00536722e-307, 2.55897414e-307, 6.45302316e-307,
6.89801416e-307],
[ 3.11521375e-307, 1.89143161e-307, 4.00540117e-307,
4.45042273e-307]],
[[ 4.00536043e-307, 6.89799379e-307, 3.11521375e-307,
-1.04700663e-310],
[ 4.00540117e-307, 4.22764033e-307, 2.33648883e-307,
4.00536722e-307],
[ 6.89798700e-307, 2.33647015e-307, 2.33646676e-307,
1.61324815e-307]]])
返回一堆未初始化的垃圾数值
'''
np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 返回一维的数组,如果需要对数组进行维度的重设,可以用reshape
np.array(10).reshape(2,5)
'''
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
'''
np.ones(10) #array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
np.ones((2,3))
'''
array([[1., 1., 1.],
[1., 1., 1.]])
'''
np.full((2,3),2)
'''
array([[2, 2, 2],
[2, 2, 2]])
'''
np.ones_like()
np.zeros_like()
np.full_like()
np.empty_like()
2.数组的数据类型
#在创建数组时,对数据类型进行指定
d=np.ones((3,3),dtype=int)
#显示数组的数据类型
d.dtype # dtype('int32')
#显性转换数据类型
d1=d.astype(float)
d1.dtype #dtype('float64')
- ndarray的向量化计算
对数组内的元素进行批量操作时,可以不适用for循环,这种特性称为向量化。
在两个相同尺寸的数组之间的算数操作应用了逐元素操作的方式
#标量与数组的计算
a=np.ones((2,4))
2*a
'''
array([[2., 2., 2., 2.],
[2., 2., 2., 2.]])
'''
#数组之间的计算
b=np.arange(8).reshape(2,4)
b+a
'''
array([[1., 2., 3., 4.],
[5., 6., 7., 8.]])
'''
#数组间的比较,逐元素比较,返回布尔值
b>a
'''
array([[False, False, True, True],
[ True, True, True, True]])
'''
4.索引和切片
数组的一维索引和列表相似
数组的切片时原数组的视图,对切片所进行的修改会体现在原视图上
这是因为数组通常处理很大的数据量,如果持续拷贝会造成内存的极大占据。
a=np.arange(10)
a_s=a[2:5]
a[2:5]=20
a # array([ 0, 1, 20, 20, 20, 5, 6, 7, 8, 9])
a[2:5].copy()
#通过copy函数实现对切片的复制
二维数组的索引可以通过递归或者逗号分隔列表的方式访问,单个索引值返回的时一维数组,因此高维数组可以通过索引返回降低一个维度的数组。
arr=np.arange(8).reshape(2,4)
arr[1][2]
a[1,2]
多维数组的切片也可以通过用逗号分隔列表的形式
arr_1=np.arange(20).reshape(4,5)
arr_1[0:3,:3]
除了通过数值直接对数组进行索引外,还有一种索引方式称为布尔索引。
arr_index=np.array(['a','b','a','c','c','a','d'])
data=np.random.randn(7,4)
data
'''
array([[-0.38442984, -0.88940964, -0.03817829, -0.43782877],
[ 0.71924953, -2.1513206 , -0.49891461, 0.96356112],
[-0.11265069, -0.1308082 , -1.17425045, -0.90269553],
[-0.61687358, -0.41279736, -0.20380161, 0.97799777],
[-0.2272037 , 0.13233819, -1.41848052, -1.40792587],
[-0.76249436, 0.40601437, 0.94575769, -0.65340026],
[ 0.08851067, -0.03728107, -0.33236625, -0.63150696]])
'''
#得到一个7行4列的数组
data[arr_index=='a']
'''
array([[-0.38442984, -0.88940964, -0.03817829, -0.43782877],
[-0.11265069, -0.1308082 , -1.17425045, -0.90269553],
[-0.76249436, 0.40601437, 0.94575769, -0.65340026]])
'''
#筛选得到数组中对应的行
布尔数组arr_index的长度和数组的纵向索引长度一致,因此可以用来对数组进行筛选。
除了进行正向选择,还可以对条件取反。
data[arr_index != 'a']
data[~(arr_index==a)]
也可以对多个条件联合
data[(arr_index == 'a') | (arr_index == 'b')] # 取交和取并使用符号,关键词and/or对布尔值数组无效
布尔索引和普通索引的另一个不同点是,布尔索引得到的是数据的拷贝,不能对原数据进行直接的修改。
除了布尔索引和普通索引外,数组能通过整数数组或者列表进行索引,叫做神奇索引。
arr_2=np.zeros((6,6))
for i in range(6):
arr_2[i]=i
arr_2
'''
array([[0., 0., 0., 0., 0., 0.],
[1., 1., 1., 1., 1., 1.],
[2., 2., 2., 2., 2., 2.],
[3., 3., 3., 3., 3., 3.],
[4., 4., 4., 4., 4., 4.],
[5., 5., 5., 5., 5., 5.]])
'''
arr_2[[2,5,1]]
'''
array([[2., 2., 2., 2., 2., 2.],
[5., 5., 5., 5., 5., 5.],
[1., 1., 1., 1., 1., 1.]])
'''
#筛选得到对应行数的数组
arr_3=np.arange(32).reshape(8,4)
arr_3
'''
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],
[24, 25, 26, 27],
[28, 29, 30, 31]])
'''
arr_3[[2,5,1,6],[0,3,1,2]]
#array([ 8, 23, 5, 26])
#相当于选取了[2,0][5,3][1,1][6,2]位置的内容
arr_3[[2,5,1,6]][:,[0,3,1,2]]
#如此可以得到二维的切片,相当于先选取了对应的4行,在每行中选取不同的列数的元素组成新行