NumPy学习(3、使用数组进行面向数组编程)

import numpy as np

'''
使用NumPy数组可以使你利用简单的数组表达式完成多种数据操作任务,而无须写些大量循环。这种利用数组表达式来替代显示循环的方法,称为向量化。
通常,向量化的数组操作会比纯Python的等价实现在速度上快一到两个数量级,这对所有种类的数值计算产生了最大的影响。
'''


#1、将条件逻辑作为数组操作
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])
cond = np.array([True, False, True, True, False])

result = [(x if c else y) for x, y, c in zip(xarr, yarr, cond)]
#虽然可以用上述的列表推导式来获得结果,但是如果数组很大的话,速度会很慢;另外当数组是多维时,就无法奏效了,而使用np.where可以非常简单地完成
result = np.where(cond, xarr, yarr)

'''np.where的第二个和第三个参数并不需要是数组,它们可以是标量。where在数据分析中的一个典型用法是根据一个数组来生成一个新的数组。
假设有一个随机生成的矩阵数据,需要将其中的正值都替换成2,所有负值替换成-2,用np.where就可以很简单完成'''
arr = np.random.randn(4, 4)
print(arr)
print(np.where(arr > 0, 2, -2))
'''也可以使用np.where将标量和数组联合,将arr中的所有正值替换为常数2'''
print(np.where(arr > 0, 2, arr))

# 2、数学和统计方法
arr = np.random.randn(5, 4)
print(arr)
print("arr.sum(1)的结果是:{}".format(arr.sum(1))) #计算列轴向的累和(其实就是每一行的数字加起来)
print("arr.sum(0)的结果是:{}".format(arr.sum(0))) #计算行轴向的累和(其实就是每一列的数字加起来)
print("arr.mean(1)的结果是:{}".format(arr.mean(1))) #计算每一行的平均值
print("arr.mean(0)的结果是:{}".format(arr.mean(0))) #计算每一列的平均值

'''
NumPy数组中的元素索引
                axis1
            0      1      2
        0  0,0    0,1    0,2
axis0   1  1,0    1,1    1,2
        2  2,0    2,1    2,2
'''

arr = np.array([0, 1, 2, 3, 4, 5, 6, 7])
print(arr.cumsum()) #返回:[ 0  1  3  6 10 15 21 28] 累积函数

arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
print(arr.cumsum(axis=0))
'''
输出:
[[ 0  1  2]
 [ 3  5  7]
 [ 9 12 15]]'''

print(arr.cumprod(axis=1))
'''
输出:
[[  0   0   0]
 [  3  12  60]
 [  6  42 336]]
'''

'''
基础数组统计方法
方法              描述
sum               沿着轴向计算所有元素的累和,0长度的数组,累和为0
mean              数学平均,0长度的数组平均值为NaN
std, var          标准差和方差,可以选择自由度调整(默认分母是n)
min, max          最小值和最大值
argmin, argmax    最小值和最大值的位置
cumsum            从0开始元素累积和
cumprod           从1开始元素累积积'''

#3、布尔值数组的方法
arr = np.random.randn(100)
print((arr>0).sum()) #正值的个数

# '''对于布尔值数组,any检查数组中是否至少有一个True,而all检查是否每个值都是True'''
bools = np.array([False, False, True, False])
print(bools.any()) #返回True
print(bools.all()) #返回False

#4、排序
#np.sort返回的是已经排序好的数组拷贝,而不是对原数组按位置排序
arr = np.random.randn(6)
arr.sort()
print(arr)

#可以在多维数组中根据传递的axis值,沿着轴向对每个一维数组段进行排序:
arr = np.random.randn(5, 3)
print(arr)

arr.sort(1) #对列轴进行排序(也就是将每一行按从小到大排序)
print(arr)

#唯一值与其他集合逻辑
#在Python中一般的列表去重用set(集合:无序不重复元素集):
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
print(sorted(set(names)))

#在Numpy中,可以直接用np.unique,返回的是数组中唯一值排序后形成的数组
print(np.unique(names))

#np.in1d可以检查一个数组中的值是否在另外一个数组中,并返回一个布尔值数组:
values = np.array([6, 0, 0, 3, 2, 5, 6])
print(np.in1d(values, [2, 3, 6])) #返回:[ True False False  True  True False  True]

'''
数组的集合操作
方法                              描述
unique(x)                         计算x的唯一值,并排序
intersect1d(x, y)                 计算x和y的交集,并排序
union1d(x, y)                     计算x和y的并集,并排序
in1d(x, y)                        计算x中的元素是否包含在y中,返回一个布尔值数组
setdiff1d(x, y)                   差集,在x中但不在y中的x的元素
setxor1d(x, y)                    异或集,在x或y中,但不属于x、y交集的元素
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值