【自学】利用python进行数据分析 LESSON 3 <Numpy基础——使用数组进行面向数组编程>

目录

前言

一、通用函数

1. 一元通用函数

 2. 二元函数

二、使用数组进行面向数组编程

1. 将条件逻辑作为数组操作

2. 数学和统计方法

3. 布尔值数组的方法

4. 排序

(1)一维数组:

(2)多维数组:

总结


前言

主要讲解通用函数以及使用数组进行面向数组编程


一、通用函数

通用函数是一种在ndarray 数据中进行逐元素操作的函数。

1. 一元通用函数

对一个数组中的每一个元素进行函数的计算,称为一元通用函数。

具体包括:

 

 示例:

import numpy as np
import math

arr = np.random.randn(10).reshape(2,5)
brr = np.random.randn(10).reshape(2,5)
print(f'arr is {arr}')
print(f'brr is {brr}')


'''三角函数'''
a = np.sin(arr)
print(a)
b = np.sin(math.pi / 2)
print(b)
#说明sin()内部的是弧度制,不是角度制


'''最值'''
c = np.maximum(arr, brr)
print(c)
#取两个矩阵中每个对应位置的最大值,组成新的矩阵

结果:

arr is [[ 0.2008774   0.86759394 -0.49576673  0.29669583  1.77005665]
 [ 0.81019089  0.55582425  0.80434938  0.03919788 -1.07458846]]
brr is [[-0.90014144  0.12612883 -1.31993835 -0.20989374  0.72208109]
 [ 0.43594838 -0.5515657  -0.37663633 -0.71596469 -1.17655632]]
[[ 0.19952916  0.76277524 -0.47570621  0.29236201  0.98021326]
 [ 0.72441878  0.52764365  0.72037954  0.03918784 -0.87939429]]
1.0
[[ 0.2008774   0.86759394 -0.49576673  0.29669583  1.77005665]
 [ 0.81019089  0.55582425  0.80434938  0.03919788 -1.07458846]]

 2. 二元函数


二、使用数组进行面向数组编程

示例:

import numpy as np

points = np.arange(-5, 5, 0.01)
xs, ys = np.meshgrid(points, points)
#np.meshgrid函数接收两个一维数组,并根据两个数组的所有(x,y)对生成一个二维矩阵
print(ys)
z = np.sqrt(xs ** 2 + ys ** 2)
print(z)

结果:

[[-5.   -5.   -5.   ... -5.   -5.   -5.  ]
 [-4.99 -4.99 -4.99 ... -4.99 -4.99 -4.99]
 [-4.98 -4.98 -4.98 ... -4.98 -4.98 -4.98]
 ...
 [ 4.97  4.97  4.97 ...  4.97  4.97  4.97]
 [ 4.98  4.98  4.98 ...  4.98  4.98  4.98]
 [ 4.99  4.99  4.99 ...  4.99  4.99  4.99]]
[[7.07106781 7.06400028 7.05693985 ... 7.04988652 7.05693985 7.06400028]
 [7.06400028 7.05692568 7.04985815 ... 7.04279774 7.04985815 7.05692568]
 [7.05693985 7.04985815 7.04278354 ... 7.03571603 7.04278354 7.04985815]
 ...
 [7.04988652 7.04279774 7.03571603 ... 7.0286414  7.03571603 7.04279774]
 [7.05693985 7.04985815 7.04278354 ... 7.03571603 7.04278354 7.04985815]
 [7.06400028 7.05692568 7.04985815 ... 7.04279774 7.04985815 7.05692568]]

通过示例可知,numpy能够利用简单的数组表达式完成多种数据操作任务,不需要写循环。

1. 将条件逻辑作为数组操作

示例:

有两个数值数组和一个布尔数组。当布尔数组为True 时,输出 xarr 的值,否则输出 yarr 的值

import numpy as np

results = np.random.randn(5)
xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
carr = np.array([True, False, True, True, False])

for i in range(5):
    if carr[i] == True:
        results[i] = xarr[i]
        #results.append(xarr[i])
    else:
        results[i] = yarr[i]
        #results.append(yarr[i])
        
print(results)

结果:

[1.1 2.2 1.3 1.4 2.5]

如果使用append() 最终生成的是list格式的,不是darray格式的,因此不用,详细输出如下:

[1.1, 2.2, 1.3, 1.4, 2.5]

说明:

python numpy.array 与list类似,不同点:前者区分元素不用逗号,中间用空格,矩阵用[]代表行向量,两个行向量中间仍无逗号;而list区分元素用逗号.

可以看出,上面我自己写的代码是用了循环的,下面介绍一种简单的方法:

代码:

import numpy as np

xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
carr = np.array([True, False, True, True, False])

result = np.where(carr, xarr, yarr)
print(result)

结果:

[1.1 2.2 1.3 1.4 2.5]

np.where函数是三元表达式,用法详见往期文章:

https://blog.csdn.net/mzy20010420/article/details/126994743icon-default.png?t=M85Bhttps://blog.csdn.net/mzy20010420/article/details/126994743

2. 数学和统计方法

许多关于计算整个数组统计值或关于轴向数据的数学函数,可以作为数组类型的方法被调用。

基础数组统计方法如下:

像mean、sum等函数可以接收一个可选参数axis,这个参数可以用于计算给定轴向上的统计值,形成一个下降一维度的数组。

示例:

import numpy as np

arr = np.random.randn(3, 4)
print('arr is :')
print(arr)

result_1_mean = arr.mean(axis = 1)
#计算每一行的平均值
print('result_1_mean is :')
print(result_1_mean)
result_1_sum = arr.sum(axis = 1)
#计算每一行的和
print('result_1_sum is :')
print(result_1_sum)


result_2 = arr.mean(axis = 0)
#计算每一列的平均值
print('result_2 is :')
print(result_2)

 结果:

arr is :
[[ 0.28753056 -1.83200328 -0.76927993 -1.83899567]
 [ 0.63546602  0.88963314 -2.00142301  0.63808752]
 [ 1.80527873  0.66049888  1.74181341  0.41347778]]
result_1_mean is :
[-1.03818708  0.04044092  1.1552672 ]
result_1_sum is :
[-4.15274832  0.16176367  4.62106879]
result_2 is :
[ 0.9094251  -0.09395709 -0.34296317 -0.26247679]

3. 布尔值数组的方法

布尔值会被强制为1(true)和 0 (false)。因此sum通常可以用于计算布尔值数组中的 true 个数

代码:

import numpy as np

arr = np.random.randn(10)
print(arr) #数值
brr = (arr > 0)
print(brr) #布尔值
result = brr.sum()
print(result)

结果:

[ 0.10847049 -0.68258209 -0.25992123  0.29788256  0.66460949  1.95982182
 -1.32201293 -1.8368534  -0.57445982  0.21682542]
[ True False False  True  True  True False False False  True]
5

对于布尔值,有两个非常有用的方法 any 和 all。

any:检查数组中是否存在true

all : 检查每个值是否都是true

代码:

import numpy as np

arr = np.random.randn(10)
print(arr) #数值
brr = (arr > 0)
print(brr) #布尔值
a = brr.any()
print(a)
b = brr.all()
print(b)

结果:

[ 1.05981695  1.02291611  0.58687917 -0.43014503 -0.57343774  0.46263633
  1.43173936  1.53825273 -1.19825518 -0.4702513 ]
[ True  True  True False False  True  True  True False False]
True
False

这些方法也适用于非布尔值,所有的非0元素都按true处理

4. 排序

numpy数组可以使用sort方法按位置排序

(1)一维数组:

代码:

import numpy as np

arr = np.random.randn(10)
print(arr)
arr.sort()
print(arr)

结果:

[-0.88150672  1.3037882  -0.22020789 -0.92153343  1.27228773 -0.54757564
 -0.08119291  0.31915981 -0.76821659  1.76029931]
[-0.92153343 -0.88150672 -0.76821659 -0.54757564 -0.22020789 -0.08119291
  0.31915981  1.27228773  1.3037882   1.76029931]

注意:

在使用 sort 排序的时候,是不允许做其他的处理的,否则会只输出none,没有结果。

代码:

import numpy as np

arr = np.random.randn(10)
print(arr)
a = arr.sort()
print(a)

结果:

[ 0.91824165 -0.69197114  0.13563014  0.1505339   1.7428908   0.13639371
  0.78731129  0.55628231 -1.30037589 -0.04938327]
None

sort能够将一维数组从小到大进行重新排列

 

(2)多维数组:

代码:

import numpy as np

arr = np.random.randn(4, 4)
print(arr)
arr.sort(1) #每一行从小到大排列
print('每一行排序')
print(arr)
arr.sort(0)
print('每一行排序后再对新的数组的每一列排序')
print(arr)

结果:

[[ 0.96097955  0.5528134  -1.10905914 -1.2358687 ]
 [ 0.18683134 -1.40729074  0.74885598  0.48092012]
 [-1.31058203  0.24587023  1.44602871  0.22776827]
 [-1.60285393  0.66256377  0.66902922 -1.92685399]]
每一行排序
[[-1.2358687  -1.10905914  0.5528134   0.96097955]
 [-1.40729074  0.18683134  0.48092012  0.74885598]
 [-1.31058203  0.22776827  0.24587023  1.44602871]
 [-1.92685399 -1.60285393  0.66256377  0.66902922]]
每一列排序
[[-1.92685399 -1.60285393  0.24587023  0.66902922]
 [-1.40729074 -1.10905914  0.48092012  0.74885598]
 [-1.31058203  0.18683134  0.5528134   0.96097955]
 [-1.2358687   0.22776827  0.66256377  1.44602871]]

一些与排序相关的其他种类的数据操作,将出现在 pandas 中


总结

本节内容充分体现了numpy的优势,即不需要写复杂的循环,就可以实现对数组的操作。这部分内容看似简单,但实际应用却是千变万化的,需要在具体项目中不断积累。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rachel MuZy

你的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值