目录
前言
主要讲解通用函数以及使用数组进行面向数组编程
一、通用函数
通用函数是一种在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函数是三元表达式,用法详见往期文章:
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的优势,即不需要写复杂的循环,就可以实现对数组的操作。这部分内容看似简单,但实际应用却是千变万化的,需要在具体项目中不断积累。