2021-12-27 Python-21

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')

  1. 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行,在每行中选取不同的列数的元素组成新行

你可能感兴趣的:(2021-12-27 Python-21)