numpy 数组

import numpy as np # pip install numpy 

# 用于处理高维数据计算的包

特性:同类型的数据 

# numpy的计算效率比原生python快很多  --- 数据要达到一定的量级 

import random,time
import numpy as np

# 列表 --- 计算求和的执行时间
a = []
for i in range(10000000):
    a.append(random.random())
t1 = time.time()
sum1 = sum(a)
t2 = time.time()

# numpy
b = np.array(a) # 转成numpy数组
t3 = time.time()
sum2 = np.sum(b)   # 求和
t4 = time.time()
print(t2-t1, t4-t3)

运行结果:

0.11269879341125488 0.015958070755004883

可以看出,大数量级计算用numpy计算会快很多。

创建一维数组

1.列表转数组

# 1. 列表转数组
arr1 = np.array([1,2,3])
print(arr1)
print(type(arr1))   # 打印类型

运行结果 

[1 2 3]
<class 'numpy.ndarray'>

2.range()

arr2 = np.array(range(6))
print(arr2)

运行结果

[0 1 2 3 4 5]

3. arange(开始索引,结束索引,步长)

arr3 = np.arange(0,10,3)
print(arr3, type(arr3))

运行结果

[0 3 6 9] <class 'numpy.ndarray'>

4. np.linespace()返回在间隔[开始,结束]上计算的num个均匀间隔的样本

arr4 = np.linspace(2.0,3.0,num=5)
print(arr4)

运行结果 

[2.   2.25 2.5  2.75 3.  ]

如果把num=5 改成num=11

arr4 = np.linspace(2.0,3.0,num=11)
print(arr4)

运行结果

[2.  2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3. ]

如果把num=5改成num=7

arr4 = np.linspace(2.0,3.0,num=7)
print(arr4)

运行结果

[2.         2.16666667 2.33333333 2.5        2.66666667 2.83333333
 3.        ]

因为 7 是无法整除的,只能取近似的值 

arr4 = np.linspace(20,50,num=2)
print(arr4)

运行结果 

[20. 50.]

结果是小数,不会丢失精度。

创建二维数组

lst = [[1,2],[3,4],[5,6]]
arr5 = np.array(lst)
print(arr5)

运行结果

[[1 2]
 [3 4]
 [5 6]]

lst = [[1,2],[3,4],[5,6]]
arr5 = np.array(lst,dtype=float)  # dtype 元素的类型 
print(arr5)

运行结果 

[[1. 2.]
 [3. 4.]
 [5. 6.]]

查看数组的类型:

print(arr5.dtype)

运行结果

float64

全0的数组

print(np.zeros((3, 4)))

运行结果 

[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

全1的数组

print(np.ones((2,3)))

运行结果 

[[1. 1. 1.]
 [1. 1. 1.]]

数组的运算

arr1 = np.array([[1,2,3],[4,5,6]])
print(arr1)
print("*"*20)
print(arr1+arr1)  # 对应位置的元素进行加减乘除
print("*"*20)
print(arr1*arr1)
print("*"*20)
print(1/arr1)    # 广播机制 

运行结果 

[[1 2 3]
 [4 5 6]]
********************
[[ 2  4  6]
 [ 8 10 12]]
********************
[[ 1  4  9]
 [16 25 36]]
********************
[[1.         0.5        0.33333333]
 [0.25       0.2        0.16666667]]

索引和切片 

ar = np.arange(5,20)
print(ar)
print("*"*30)
# 取8
print(ar[3])
# 取8-10
print(ar[3:6])
# 间隔取
print(ar[3::2])

运行结果 

[ 5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
******************************
8
[ 8  9 10]
[ 8 10 12 14 16 18]

二维数组 

ar2 = np.arange(16).reshape(4,4)  # reshape重新捏一下形状 reshape里面的两个数相乘一定要等于arange里面的数
print(ar2)

运行结果 

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]

如果reshape里面参数改成(4,5),会报错 

ar2 = np.arange(16).reshape(4,5)  # reshape重新捏一下形状 reshape里面的两个数相乘一定要等于arange里面的数
print(ar2)

运行结果 

ar2 = np.arange(16).reshape(4,5)  # reshape重新捏一下形状 reshape里面的两个数相乘一定要等于arange里面的数
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: cannot reshape array of size 16 into shape (4,5)

取第一行,下标从0开始 

print(ar2[0])

运行结果

[0 1 2 3]

取2 

print(ar2[0][2])
print(ar2[0,2])  # 行号 列号 省略方式 

运行结果 

2
2

取 5 6 9 10

print(ar2[1:3,1:3])

运行结果 

[[ 5  6]
 [ 9 10]]

布尔型索引

teachers = np.array(['rose','haha','Jack','robot','Tom'])
print(teachers == 'rose')  # 凡是判断的结果一定是True 或者 False

运行结果

[ True False False False False]

data = np.random.randn(5,4)
print(data)

运行结果 

[[ 1.08893953 -0.70317228  0.55169662 -1.30495173]
 [ 0.98154633 -0.72936513  0.33058208  0.57239182]
 [-0.40509382  0.15353756  1.73665277  0.00415434]
 [ 1.01259648 -1.48156185  1.05480352 -0.06303268]
 [-0.23894871 -0.45785407  0.38477254  0.24553404]]

如果把teachers == 'rose'作为条件放到data里面会发生什么?

# 按条件筛选data数据
print(data[teachers == 'rose'])

运行结果 

[[ 0.66567526 -0.38454582  0.18877536 -0.46789483]]

只有条件为真的时候才输出,如果条件为假,则不输出数据 

data里面有正数,有负数,把小于0的筛选出来 

print(data[data<0])

运行结果 

[-1.5186963  -0.97091759 -1.30439112 -0.91095577 -0.2362025  -0.27058865
 -2.23508056 -0.34103601 -0.74653296 -0.97800185 -1.41998651]

注意:用pycharm每次运行的时候随机数都不同,所以运行结果也是不同的随机数

生活案例小实战

heights = np.array([1.65,1.75,1.80,1.70,1.60])
weights = np.array([65,70,80,75,55])
# BMI
bmi = weights/(heights**2)
print(bmi)

运行结果 

[23.87511478 22.85714286 24.69135802 25.95155709 21.484375  ]

统计函数

exam_scores = np.array([85,78,92,88,70,95,80,85,90,78,84,88,92,86,75])
# 平均值和中位数
mean_score = np.mean(exam_scores)  # 平均值
median_score = np.median(exam_scores)  # 中位数
print(mean_score, median_score)
# 最高分和最低分
print(np.max(exam_scores),np.min(exam_scores))
# 最大值和最小值对应的索引
print(np.argmax(exam_scores), np.argmin(exam_scores))  

运行结果 

84.4 85.0
95 70
5 4

np.where ()

# 三元表达式:为真的结果 if 条件 else 为假的结果
# np.where() 和 三元表达式的效果是差不多的, 为什么用它,在处理大规模数据的时候np.where()会更加灵活,它处理的效率会更高
arr1 = np.array([1, 8, 10, 22])
arr2 = np.array([22, 44, 66, 17])
cond = np.array([True,False, True,False])
# 三元表达式
res = [(x if c else y) for x, c, y in zip(arr1,cond,arr2)]
print(res)

# np.where(条件,x,y)
print(np.where([True, False, True, False], arr1, arr2))

运行结果 

[1, 44, 10, 17]
[ 1 44 10 17]

w = np.array([8,10,22,66])
print(np.where(w > 10))  # 返回符合条件的下标

print(np.where(w > 10, 88, w))  # 如果元素大于10,改为88, 如果不大于10,还用原来的值

运行结果 

(array([2, 3], dtype=int64),)
[ 8 10 88 88]

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值