小白笔记day01:numpy基础2

1.1 如何生成数组,ndarray

使用array函数生成:

1list = [1,2,3,45,6,7,8]
2arr1 = np.array(list)
3
4>>>array([ 1,  2,  345,  6,  7,  8])

还有zeros,ones函数:

1>>> np.zeros(5)
2array([0.0.0.0.0.])
1>>> np.zeros((2,3))
2array([[0.0.0.],
3       [0.0.0.]])
1>>> np.ones(10)
2array([1.1.1.1.1.1.1.1.1.1.])

arange函数:

1>>> np.arange(12)
2array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  91011])

1.2 数据类型可以使用astype进行转换

1>>> arr= np.array([1,2,3,4,5,6,7,8,9])
2
3>>> arr.dtype
4dtype('int32')
5
6>>> float_arr = arr.astype(np.float64)
7
8>>> float_arr.dtype
9dtype('float64')

1.3 numpy数组运算

 1>>> arr = np.array([[4,5,6,8],[1,2,3,4]])
2
3>>> arr
4array([[4568],
5       [1234]])
6
7>>> arr*arr
8array([[16253664],
9       [ 1,  4,  916]])
10
11>>> arr-arr
12array([[0000],
13       [0000]])
14
15>>> 1/arr
16array([[0.25      , 0.2       , 0.166666670.125     ],
17       [1.        , 0.5       , 0.333333330.25      ]])
18
19
20>>> arr*0.5
21array([[2. , 2.53. , 4. ],
22       [0.51. , 1.52. ]])

同尺寸数组之间比较,会产生一个布尔值数组。不同尺寸之间的操作则会使用到广播特性。

1.4 索引与切片

一维数组的切片看起来和列表一个样子。

1>>> arr = np.arange(15)
2>>> arr
3array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  91011121314])
4
5>>> arr[2:5]
6array([234])

数组的切片是是个原数组的视图,任何对视图的修改都会反映到原数组上。

1>>> arr[0:4] = 5
2>>> arr
3array([ 5,  5,  5,  5,  4,  5,  6,  7,  8,  91011121314])

对于高维数组,每个索引值对应的元素是一维数组。

1>>> arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
2
3>>> arr2d[2]
4array([789])
1>>> arr2d[2][0]
2  7

numpy 的多维数组中,要注意原数组的维度进行索引值的设置,否者容易出错。
来感受一下区别:

arr3d = np.arange(12).reshape((2,2,3))

>>> arr3d
array([[[ 0,  1,  2],
        [ 3,  4,  5]],

       [[ 6,  7,  8],
        [ 91011]]])

>>> arr3d[0]
array([[012],
       [345]])

>>> arr3d[1,0]
array([678])

>>> arr3d[1,0,0]
6

多维数组的切片,类似于从高维往低维递进的一个过程。比如:

>>> arr3d[:1]
array([[[012],
        [345]]])

>>> arr3d[:1,:1]
array([[[012]]])

>>> arr3d[:1,:1,:1]
array([[[0]]])

>>> arr3d[:1,1]
array([[345]])

>>> arr3d[:,:,1]
array([[ 1,  4],
       [ 710]])

1.5 布尔索引

布尔值数组长度必须与数组轴索引长度一致,当布尔值数组长度不确定时,并不会报错,所以要当心。

>>> arr = np.arange(15).reshape((5,3))

>>> arr
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 91011],
       [121314]])

>>> arr_bool = np.array([TrueFalse,True,True,False])

>>> arr[arr_bool]
array([[ 0,  1,  2],
       [ 6,  7,  8],
       [ 91011]])

可以对多个布尔值条件进行联合,如&或者|, 对于布尔数组,pytrhon 的关键字and 和 or 并不管用。而且使用布尔索引时总是生成数据的拷贝。
基于一般的常识来设置布尔数组也是可行的:

>>> arr[arr>5]
array([ 6,  7,  8,  91011121314])

1.6 神奇索引

神奇索引时numpy是术语,用于描述使用整数数组进行数据索引。

>>> arr
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 91011],
       [121314]])


>>> arr[[4,0,1,2]]
array([[121314],
       [ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8]])
#传入多个索引数组
>>> arr[[0,1,2,3,4],[0,1,2,2,0]]
array([ 0,  4,  81112])

#取到位置(0,0),(1,1),(2,2),(3,2),(4,0)的值

1.7 数组的转置和换轴

我的理解和线性代数上的转置是一个道理,行列互换。
数组有transpose方法,也有特殊的T属性。

>>> arr
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 91011],
       [121314]])

>>> arr.T
array([[ 0,  3,  6,  912],
       [ 1,  4,  71013],
       [ 2,  5,  81114]])

进行矩阵计算,比如进行内积计算会用到:np.dot()

>>> arr
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 91011],
       [121314]])

>>> arr.T
array([[ 0,  3,  6,  912],
       [ 1,  4,  71013],
       [ 2,  5,  81114]])

>>> arr_dot = np.dot(arr.T, arr)

>>> arr_dot
array([[270300330],
       [300335370],
       [330370410]])
>>> 

对于更高维的数组,transpose方法可以接受包含轴编号的元组,用于置换轴:

>>> ar = np.arange(16).reshape((2,2,4))

>>> ar
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  91011],
        [12131415]]])

>>> ar.transpose((1,0,2))
array([[[ 0,  1,  2,  3],
        [ 8,  91011]],

       [[ 4,  5,  6,  7],
        [12131415]]])
轴进行了重新排序,原先的第一个和第二个换了位置,最后一个没有变。

ndarray有一个swapaxes方法,该方法接受一对编号作为参数,并对轴进行调整用于数据重组。

>>> ar
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  91011],
        [12131415]]])

>>> ar.swapaxes(1,2)
array([[[ 0,  4],
        [ 1,  5],
        [ 2,  6],
        [ 3,  7]],

       [[ 812],
        [ 913],
        [1014],
        [1115]]])
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值