Numpy基本操作

Numpy基本操作

1 数组的索引、切片
  • 直接进行索引切片
  • 对象[:,:]先行后列

二维数组的索引方式:

# 二维数组,两个维度
a[0,0:3]	# 二维数组中的第一个一维数组中的前三个元素

三维数组的索引方式:

# 三维
>>> a1 = np.array([ [[1,2,3],[4,5,6]], [[12,3,34],[5,6,7]]])
# 返回结果
array([[[ 1, 2, 3],
	[ 4, 5, 6]],
	[[12, 3, 34],
	[ 5, 6, 7]]])
# 索引、切片
>>> a1[0, 0, 1]	# 第一个二维数组中的第一个一维数组中的第二个元素
# 输出: 2
2 形状修改
2.1 ndarray.reshape(shape, oreder)
  • 参数:

    • shape: 修改后数组的形状
    • order:修改的顺序
  • 返回一个具有相同数据域,但shape不一样的视图

  • 行、列不进行互换

# 准备数据
stock_change = np.random.normal(0, 1, (4, 5))
# 在转换形状的时候,一定要注意数组的元素匹配
stock_change.reshape([5, 4])
stock_change.reshape([-1,10]) # 数组的形状被修改为: (2, 10), -1: 表示通过待计算
2.2 ndarray.resize(new_shape)
  • 修改数组本身的形状(需要保持元素个数前后相同)
  • 行、列不进行互换
stock_change.resize([5, 4]) # 不返回数组,对源数组进行修改
# 查看修改后结果
stock_change.shape
(5, 4)
2.3 ndarray.T
  • 数组的转置
  • 将数组的行、列进行互换
3 类型修改
3.1 ndarray.astype(type)
  • 返回修改类型之后的数组

    stock_change.astype(np.int32)
    
3.2 ndarray.tosting([order])或者ndarray.tobytes([order])
  • 构造包含数组中原始数据字节的python字节

    arr = np.array([[[1, 2, 3], [4, 5, 6]], [[12, 3, 34], [5, 6, 7]]])
    arr.tostring()
    

    返回结果:

    b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x0c\x00\x00\x00\x03\x00\x00\x00"\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00'
    
3.3 jupyter输出太大可能导致崩溃问题

如果遇到

IOPub data rate exceeded.
The notebook server will temporarily stop sending output
to the client in order to avoid crashing it.
To change this limit, set the config variable
`--NotebookApp.iopub_data_rate_limit`.

这个问题是在jupyer当中对输出的字节数有限制,需要去修改配置文件

创建配置文件

 jupyter notebook --generate-config vi ~/.jupyter/jupyter_notebook_config.py 

取消注释,多增加

## (bytes/sec) Maximum rate at which messages can be sent on iopub before they 
# are limited.
c.NotebookApp.iopub_data_rate_limit = 10000000

但是不建议这样去修改,jupyter输出太大会崩溃

4 数组去重
4.1 np.unique()
>>> temp = np.array([[1, 2, 3, 4],[3, 4, 5, 6]])
>>> np.unique(temp)
array([1, 2, 3, 4, 5, 6])
5 ndarray运算
5.1 逻辑运算
# 生成10名同学,5门功课的数据
>>> score = np.random.randint(40, 100, (10, 5))
>>> score
array([[69, 81, 72, 82, 60],
       [67, 54, 79, 71, 50],
       [91, 63, 97, 54, 81],
       [48, 40, 78, 41, 53],
       [61, 98, 56, 91, 56],
       [99, 58, 42, 44, 67],
       [61, 78, 80, 90, 72],
       [51, 72, 63, 73, 96],
       [47, 50, 48, 79, 48],
       [85, 90, 82, 70, 91]])
# 取出最后4名同学的成绩,用于逻辑判断
>>> test_score = score[6:, 0:5]
# 逻辑判断, 如果成绩大于60就标记为True 否则为False
>>> test_score > 60
array([[ True,  True,  True,  True,  True],
       [False,  True,  True,  True,  True],
       [False, False, False,  True, False],
       [ True,  True,  True,  True,  True]])
# BOOL赋值, 将满足条件的设置为指定的值-布尔索引
>>> test_score[test_score > 60] = 1
>>> test_score
array([[ 1,  1,  1,  1,  1],
       [51,  1,  1,  1,  1],
       [47, 50, 48,  1, 48],
       [ 1,  1,  1,  1,  1]])
5.2 通用判断函数
  • np.all()

    判断的内容全部符合要求返回True

    # 判断前两名同学的成绩[0:2, :]是否全及格
    >>> np.all(score[0:2, :] > 60)
    False
    
  • np.any()

    判断的内容有一个符合要求就返回True

    # 判断前两名同学的成绩[0:2, :]是否有大于90分的
    >>> np.any(score[0:2, :] > 90)
    False
    
5.3 np.where三元运算符
  • np.where()

    # 判断前四名学生,前四门课程中,成绩中大于60的置为1,否则为0
    >>> temp = score[:4, :4]
    >>> np.where(temp > 60, 1, 0)
    array([[1, 1, 1, 1],
           [1, 0, 1, 1],
           [1, 1, 1, 0],
           [0, 0, 1, 0]])
    
  • np.logical_andnp.logical_or

    np.where()可以结合np.logical_andnp.logical_or使用

    # 判断前四名学生,前四门课程中,成绩中大于60且小于90的换为1,否则为0
    np.where(np.logical_and(temp > 60, temp < 90), 1, 0)
    # 判断前四名学生,前四门课程中,成绩中大于90或小于60的换为1,否则为0
    np.where(np.logical_or(temp > 90, temp < 60), 1, 0)
    
6 统计运算
6.1 统计指标
  • min(a, axis)

    • Return the minimum of an array or minimum along an axis.
  • max(a, axis])

    • Return the maximum of an array or maximum along an axis.
  • median(a, axis)

    • Compute the median along the specified axis.
  • mean(a, axis, dtype)

    • Compute the arithmetic mean along the specified axis.
  • std(a, axis, dtype)

    • Compute the standard deviation along the specified axis.
  • var(a, axis, dtype)

    • Compute the variance along the specified axis.
6.2 案例:学生成绩统计运算

进行统计的时候,axis 轴的取值并不一定,Numpy中不同的API轴的值都不一样,在这里,axis 0代表列, axis 1代表行去进行统计。

# 接下来对于前四名学生,进行一些统计运算
# 指定列 去统计
temp = score[:4, 0:5]
print("前四名学生,各科成绩的最大分:{}".format(np.max(temp, axis=0)))
print("前四名学生,各科成绩的最小分:{}".format(np.min(temp, axis=0)))
print("前四名学生,各科成绩波动情况:{}".format(np.std(temp, axis=0)))
print("前四名学生,各科成绩的平均分:{}".format(np.mean(temp, axis=0)))

结果:

前四名学生,各科成绩的最大分:[91 81 97 82 81]
前四名学生,各科成绩的最小分:[48 40 72 41 50]
前四名学生,各科成绩波动情况:[15.23769996 14.87447478  9.34077085 15.70031847 12.10371844]
前四名学生,各科成绩的平均分:[68.75 59.5  81.5  62.   61.  ]

如果需要统计出某科最高分对应的是哪个同学?

  • np.argmax(temp, axis=)
  • np.argmin(temp, axis=)
print("前四名学生,各科成绩最高分对应的学生下标:{}".format(np.argmax(temp, axis=0)))

结果:

前四名学生,各科成绩最高分对应的学生下标:[2 0 2 0 2]
7 数组间运算
7.1 数组与数的运算
>>> arr = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
>>> arr + 1
array([[2, 3, 4, 3, 2, 5],
       [6, 7, 2, 3, 4, 2]]
>>> arr / 2
array([[0.5, 1. , 1.5, 1. , 0.5, 2. ],
       [2.5, 3. , 0.5, 1. , 1.5, 0.5]])
# 可以对比python列表的运算,看出区别
>>> a = [1, 2, 3, 4, 5]
>>> a * 3
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
7.2 数组与数组的额运算
>>> arr1 = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
>>> arr2 = np.array([[1, 2, 3, 4], [3, 4, 5, 6]])
ValueError                                Traceback (most recent call last)
<ipython-input-29-d972d21b639e> in <module>()
----> 1 arr1 + arr2

ValueError: operands could not be broadcast together with shapes (2,6) (2,4)
    报错,不可以进行计算
7.2.1 广播机制

数组在进行矢量化运算时,要求数组的形状是相等的。当形状不相等的数组执行算术运算的时候,就会出现广播机制,该机制会对数组进行扩 展,使数组的shape属性值一样,这样,就可以进行矢量化运算了。下面通过一个例子进行说明:

>>> arr1 = np.array([[0],[1],[2],[3]])
>>> arr1.shape
(4, 1)
>>> arr2 = np.array([1,2,3])
>>> arr2.shape
(3,)
>>> arr1+arr2
array([[1, 2, 3],
       [2, 3, 4],
       [3, 4, 5],
       [4, 5, 6]])

上述代码中,数组arr1是4行1列,arr2是1行3列。这两个数组要进行相加,按照广播机制会对数组arr1和arr2都进行扩展,使得数组arr1和arr2 都变成4行3列

这句话乃是理解广播的核心。广播主要发生在两种情况,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符,另外一种是有一方 的长度为1。

广播机制实现了时两个或两个以上数组的运算,即使这些数组的shape不是完全相同的,只需要满足如下任意一个条件即可。

  1. 如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符.

  2. 或其中的一方的长度为1。

广播会在缺失和(或)长度为1的维度上进行。

广播机制需要扩展维度小的数组,使得它与维度最大的数组的shape值相同,以便使用元素级函数或者运算符进行运算。

如果是下面这样,则不匹配:

A (1d array): 10
B (1d array): 12
A (2d array): 2 x 1
B (3d array): 8 x 4 x 3
>>> arr1 = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
>>> arr2 = np.array([[1], [3]])
>>> arr1 + arr2
array([[2, 3, 4, 3, 2, 5],
       [8, 9, 4, 5, 6, 4]])
7.3 矩阵乘法api
  • np.matmul
  • np.dot
>>> a = np.array([[80, 86],
    [82, 80],
    [85, 78],
    [90, 90],
    [86, 82],
    [82, 90],
    [78, 80],
    [92, 94]])
>>> b = np.array([[0.7], [0.3]])
>>> np.matmul(a, b)
array([[81.8],
       [81.4],
       [82.9],
       [90. ],
       [84.8],
       [84.4],
       [78.6],
       [92.6]])
>>> np.dot(a,b)
array([[81.8],
       [81.4],
       [82.9],
       [90. ],
       [84.8],
       [84.4],
       [78.6],
       [92.6]])

np.matmulnp.dot的区别: 二者都是矩阵乘法。 np.matmul中禁止矩阵与标量的乘法。 在矢量乘矢量的內积运算中,np.matmulnp.dot没有区别。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值