Numpy02

目录

1、广播机制

2、shape属性

3、reshape方法

4、resize

5、数组的切片

6、 关系运算

7、布尔掩码(mask)

8、where函数

9、花式索引


Numpy知识第一讲(点击跳转)

1、广播机制

不同维度的两个数组可以直接进行运算,但是要遵循广播机制。

怎样判断能否广播:

  1. 从里到外数方括号确认二者共同拥有的括号层级(维度)
  2. 检查每层方括号中各自包含几个元素
  3. 如果各层方括号的元素个数相等或者为一,则可以广播

import numpy as np
a = np.random.randint(1,10,(4,6))
print(a)
b = np.array([5]) #为一自动补齐为4行6列为5的数组
print(a+b)

 同维须同长,除非长为一:对于B中没有“行”维度,Numpy可以通过复制来补齐,如果某个维度上A或B的长度为一,Numpy也会通过复制,使其与另一数组长度相同。

同维不是“序号”相同,而是“方向”相同。方向指的是从里往外看顺序。例如:

  1. 一维数组方括号编号为0;二维数组内层方括号编号为0,外层编号为1。以下两个数组编号为0的方括号内元素个数相等:

        # 数组A
        [[1, 2, 3, 4],
         [5, 6, 7, 8],
         [9, 0, 1, 2]]
        # 数组B
        [1, 2, 3, 4]
  2.  高维数组从内向外依次从0编号,以下两个数组编号为0和1的方括号内元素个数相等:
        # 数组A
        [[[[1, 2, 3, 4],
           [5, 6, 7, 8]],
          [[1, 2, 3, 4],
           [5, 6, 7, 8]]],
         [[[1, 2, 3, 4],
           [5, 6, 7, 8]],
          [[1, 2, 3, 4],
           [5, 6, 7, 8]]]]
        # 数组B
        [[1, 2, 3, 4],
         [5, 6, 7, 8]]

            最里层编号为0的括号中都是4个元素,因此最里层的维度长度相等;

            倒数第2层编号为1的括号都是2个元素(子数组),故长度也相等。

错误做法:

2、shape属性

数组.shape属性返回一个元组,其中每个数字分别代表数组中某个维度的长度,即这层方括号内有多少元素。

x.shape包含有三个数字,说明x有三个维度(三层方括号),5行,4列的数组。

 判断是否适用于广播机制:

x = np.loadtxt('d:/course/products.csv',delimiter=',',dtype='int')
print(x.shape)  #返回(105,8) 105个维度,8列
y = np.array([2,1,3,2,1,1,4,3])  #(8,) 从右往左的第一个维度进行匹配都是8,可广播

3、reshape方法

数组.reshape方法:根据源数组的内容,按指定形状创建一个新的数组。

y = np.array([2,1,3,2,1,1,4,3])

a = y.reshape(2,4)  #将数组y改为2行4列赋值给a

限制条件:新数组的元素总数,必须与原数组相同。

4、resize

数组.resize方法可以将数组变形为任意形状,元素不够的位置补0,resize方法是对原数组直接变形,并不会返回新数组。

resize函数可以将数组变形,元素不够的位置循环补充数组元素,resize函数返回新数组。例如:

    y.resize(2, 5)        # resize方法
    np.resize(y, (2, 5))  # resize函数

5、数组的切片

数组的切片跟列表相同,用来获取任何一个连续区域的数据子集。(无法跨行跨列个性化提取数据)

y = np.array([2,1,3,2,1,1,4,3])

#从下标为2的元素开始,截取到下标为5(即下标6前面)结束:
y[2:6]  

#从下标为2的元素开始,截取到下标为5(即下标6前面),其中每2个元素取1个放入结果
y[2:6:2]

#从下标为6的元素开始,从右向左截取到下标为3(即从右向左时,下标2的前面)结束
#步长:每几个元素抽取一个
y[6:2:-1]  #返回array[4,1,1,2]

数组与列表一样支持设置步长,步长可以是正数或负数,例如:

    # 正数步长,从y中每两个元素取一个:
    y[1:4:2]
    # 负数步长,自后向前从y中切片:
    y[3:1:-1]

多维切片

二维数组获取单一元素与列表一样,把数组中每一个维度从左到右写出啦,用逗号隔开,然后再根据编号找出来所需要的值。例如获取1号行2号列上的元素:r[1, 2]

数组名[第一维下标或切片范围,
      第二维下标或切片范围,
      第三维下标或切片范围,
      ....]

6、 关系运算

关系运算也适用于广播,所以numpy数组可以与不同形状的元素进行比较。相当于取出数组内每个元素分别比较,结果为TrueFalse

不同维度的数组可以通过广播进行比较,数组通过广播转换为相同形状的数组,再进行每个元素的比较。

例如比较数组sh与150:sh > 150 。sh与一维列表:

通过关系运算,可以按照指定筛选条件,将数组中所有元素转换为True或False,进而实现一些特殊的统计功能。(True/False矩阵相当于0和1矩阵)

例如统计sh中大于150的元素有多少个:np.sum(sh > 150)或者np.count_nonzero(sh > 150)

count_nonzero 函数统计数组中非零元素的个数。

7、布尔掩码(mask)

布尔掩码:掩码相当于一把有洞的尺子,洞就是条件,当尺子放在数组上面,掩盖住的就是不符合条件的数字,显示出来的就是我们需要的数字。

用逻辑掩码筛取元素:1、列出筛选条件 2、将筛选条件作为数组方括号内索引

Numpy逻辑筛选可以使用逻辑运算符,但要使用位运算符号:

    与:&
    或:|
    非:~

特别提醒:建议对所有关系式都使用圆括号,以免发生优先级错误。

例如:筛选数组sh中大于150的元素并且求中位数:        

sh[sh > 150]

np.median(sh[sh > 150])

例如:过滤 150~170 之间的元素:

sh[(sh > 150) & (sh < 170)]

例如:大于150并且小于160的数字或者大于170并且小于180的数字:

sh[ (sh>150)&(sh<160) | (sh>170)&(sh<180) ]

8、where函数

where函数可以根据条件将数组元素替换为需要的值并生成新的数组。

  • 仅有参数1返回一个元组,代表符合条件的行和列坐标;
  • 参数2和参数3可以是数组或列表、字符串等其他类型;
  • 参数2和参数3可以都不写,或必须两个都写。

结构:np.where(定位条件, 符合条件改成啥, 不符合条件改成啥)

作用:修改元素和获取坐标值

                        #where不会直接修改(替换)数组而是生成新数组

sh[1,2] = 50  #修改第2行3列的值

np.where(sh>150,1,0)  #sh大于150的值修改为1,否则为0

#where函数中参数2和参数3可以是数组(或列表)
np.where(sh>150,sh*100,sh*10)  #sh所有大于150的元素乘100,所有小于或等于150的元素乘10
np.where(sh>150,[1,2,3,4,5,6],0]  #sh符合条件的0列替换为1,1列替换为2...否则为0
np.where(sh>150,['1月之星','2月之星','3月之星','4月之星','5月之星','6月之星'],
                ['1月之耻','2月之耻','3月之耻','4月之耻','5月之耻','6月之耻'])  #对应数组号替换

#where替换字符串
np.where(sh>150, ['A','B','C'], ['D','E','F'])

符合条件修改,不符合条件不改动

结构:np.where(原数组>150,1,原数组)

where函数中可以只提供“定位条件”参数、不指定后两个参数。返回一个元组,其中包含若干个numpy数组。把每个数组中对应位置的数字拼在一起,就是一个符合定位条件的元素的完整“坐标”,即该元素在原数组各维度上的索引下标。

元组有两个数组:s[0],0号维度下标,即行坐标;s[1],1号维度下标,即列坐标,可以通过zip组合,返回完整的元素坐标再通过for循环得到元素:

案例:通过where获取大于150的元素

9、花式索引

数组的花式索引可以根据各个元素的坐标从数组中抽取出来,需要将元素各个维度的坐标分别组成列表,再将各个列表按照维度顺序组成索引。

1、花式索引基础操作:两个列表,按照他们的对应顺序配对成完整坐标,但列表长度必须一致:

 结构:数组[ [行,...],[列,...] ]

2、花式索引与数字(标量)结合,numpy会自动将常数扩展为与另一个列表形状相同的列表。例如获取a中坐标为 (1, 2) (0, 2) 的元素::

花式索引可以对数组元素的提取顺序自行指定,自由灵活。

3、花式索引与切片结合,例如获取a中前4行的 1、2、5 列:

4、花式索引中,如果各个维度都是列表形式,则各列表长度必须相同,或者都符合广播机制,否则无法匹配完整坐标

花式索引与广播机制结合: a最里层这个维度上,一个长度是1,一个长度是3,按照广播规则,numpy就把长度为1的这个数组给他复制两份,让它也变成3列,长度与右边相同;左边这个数组进行扩维复制两份也变成二维数组,左右两边的数组就形状完全相同都是两行3列,可以按照顺序两两配对。:

 5、花式索引与where函数结合,可以对数组元素进行更加复杂灵活的过滤

 例如获取sh中每一列的总和小于600的那些列的数据:

1、按列求取总和。

月销量 = np.sum(sh,axis=0)

2、根据总和找到列号。

列号 = np.where(月销量<600)  #返回元组 (array([0,1,5]), dtype=int64),)

3、花式索引取出数据

sh [ : ,列号[0] ]

以上三步合并:

sh[ : , np.where( np.sum(sh, axis=0)<600 )[0]]

完结

 来自杨洋老师课堂笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值