函数库的导入
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)