基于NumPy的数组和矢量计算

函数库的导入

import numpy as np
import numpy.random as npr
import matplotlib.pyplot as plt

1、创建ndarray

  • 一个列表的转换
data = [6,7.5,8,0,1]
arr = np.array(data)
  • 利用函数创建
np.zeros(10)
Out:array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

np.arange(15)
Out:array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

np.empty((2,3,2) #创建三维数组
Out:array([[[  2.31584178e+077,   2.31584178e+077],
        [  2.96439388e-323,   0.00000000e+000],
        [  0.00000000e+000,   6.82116729e-043]],

       [[  6.51174935e-091,   7.26604176e-043],
        [  2.32752585e-057,   1.10823494e-047],
        [  3.99910963e+252,   8.34402697e-309]]])

2、基本的索引和切片

将标量值赋值给切片时,该值会自动广播到整个选区。
跟列表的区别在于,数组切片是原始数组的视图,视图上的任何修改都会直接反映到源数组上。

arr = np.arange(10)
arr_slice = arr[5:8]
arr_slice[1] = 12345 
arr
out:array([    0,     1,     2,     3,     4,     5, 12345,     7,     8,     9])

如果你想要的是切片的副本而不是视图

arr[5:8].copy()

3、布尔型索引

利用numpy.random中的randn函数生成一些正态分布的随机数据

names = np.array(["Bob","Joe","Will","Bob","Will","Joe","Joe"])
data = npr.randn(7,4)
data
Out:array([[ 0.97042918, -1.76144706, -0.40926606, -0.61488823],
       [-0.48147931, -1.12025797, -0.17635581, -0.51784523],
       [ 0.14963973, -1.45143038, -0.35992808,  1.17297906],
       [ 1.07771871,  1.5003168 , -0.42397746, -0.04366014],
       [-0.3164972 , -1.36022834, -0.59710175, -1.46400459],
       [-0.98865828,  0.17574576, -1.55613958, -0.10096422],
       [ 0.66878939, -0.87252489,  0.96695341,  1.47649286]])
       
data[names == "Bob",2:]
Out:array([[-0.40926606, -0.61488823],
       [-0.42397746, -0.04366014]])

表示否定的两种方式

data[names != "Bob"]
data[~(names == "Bob")]

通过布尔型数组设置所有负值都设置为0

data[data<0] = 0

4、花式索引

arr = np.empty((8,4))
for i in range(8):
    arr[i]=i
arr = np.arange(32).reshape((8,4))

arr
Out:array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23],
       [24, 25, 26, 27],
       [28, 29, 30, 31]])

花式索引和切片不一样,它将数据复制在新的数组里。
arr[[1,5,7,2],[0,3,1,2]]的输出为一维数组,而不是预期的期望值

arr[[1,5,7,2],[0,3,1,2]]
Out:array([ 4, 23, 29, 10])

若想要输出为二维数组,则有两种方法

arr[[1,5,7,2]][:,[0,3,1,2]]
Out:array([[ 4,  7,  5,  6],
       [20, 23, 21, 22],
       [28, 31, 29, 30],
       [ 8, 11,  9, 10]])

函数np.ix_是将两个一维整数数组转换为一个用于选取方形区域的索引器

arr[np.ix_([1,5,7,2],[0,3,1,2])]
Out:array([[ 4,  7,  5,  6],
       [20, 23, 21, 22],
       [28, 31, 29, 30],
       [ 8, 11,  9, 10]])

5、数值转置

arr.T

计算矩阵的内积

np.dot(arr.T,arr)

6、利用数组做数据处理

函数np.meshgrid接受两个一维数组,并产生两个二维矩阵,对应于两个数组种所有的(x,y)

points = np.arange(-5,5,0.01) #1000个间隔相等的点
xs,ys = np.meshgrid(points,points)
z = np.sqrt(xs**2+ys**2)
Out:array([[ 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]])

函数值图形化的结果

plt.imshow(z,cmap=plt.cm.gray); plt.colorbar()
plt.title("Image plot of $sqrt(x^2 + y^2)$ for a grid of values")

在这里插入图片描述

7、条件逻辑表述转化成数组计算

numpy.where(c,x,y) 函数可以表达为 x if condition else y

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(cond,xarr,yarr)

8、数组的文件输入输出

用于数组以二进制格式保存到磁盘中

arr = np.arange(10)
np.save("some_array",arr) #数据的读入
np.load("some_array.npy")  #数据的读出

读取压缩文件

np.savez("array_archive.npz",a=arr,b=arr)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值