numpy——数组

目录

一、创建简单数组

1.1 蛮力构造法

1.2 特殊数值法

1.3 随机数值法

1.4  定长分割法

二、创建复杂数组

2.1 重复构造法

2.2  网格构造法

2.3  画3D图形


创建数组的方法,分成了创建简单数组和构造复杂数组两大类。其实简单数组和复杂数组并没有严格的分界线,大致上,无中生有创造出来的数组称为简单数组,通过移花接木、举一反三创造出来的数组称为复杂数组。

一、创建简单数组

用的构造简单数组的方法可以分为四类,分别是蛮力构造法、特殊数值法、随机数值法和定长分割法。

1.1 蛮力构造法

蛮力构造法使用 np.array() 来创建数组,标准写法为:

a = np.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)

想要什么结构,就使用列表或者元组表示出来即可:

a = np.array([[1,2,3],
            [4,5,6]]
             )
a = np.array(((1,2,3),
              (4,5,6)))

1.2 特殊数值法

特殊值一般指0,1,空值等。特殊数值法适合构造全0、全1、空数组,或者由0、1组成的类似单位矩阵,比如主对角线为1,其余为0的数组。

可以使用的函数有:


numpy.zeros(shape, dtype=float, order=‘C’)  0数组
numpy.ones(shape, dtype=float, order=‘C’)    1数组
numpy.empty(shape, dtype=float, order=‘C’)   空数组,但是要指明数据类型
numpy.eye(N, M=None, k=0, dtype=float, order='C’)   单位矩阵

例如:

print(np.zeros((3,3),dtype=float))
print(np.ones((3,3),dtype=int))
print(np.empty((3,3)))
print(np.empty((3,3),dtype=bool))
print(np.eye(3,3))

还可以使用fill方法填充函数往矩数组里填充数组

a = np.empty((3,3))
a.fill(4)
print(a)

[[4. 4. 4.]
 [4. 4. 4.]
 [4. 4. 4.]]

1.3 随机数值法

NumPy 也有一个 random 子模块,用随机数值法创建数组,主要就是使用 random 子模块。常用的模块有:

random() 生成 [0,1) 区间内的随机浮点数数;randint() 生成 [low, high) 区间内的随机整数;ormal() 生成以 loc 为均值、以 scale 为标准差的正态分布数组

numpy.random.random(size=None)
numpy.random.randint(low, high=None, size=None, dtype=‘l’)
numpy.random.normal(loc=0.0, scale=1.0, size=None)

例如:

print(np.random.random(5))
print(np.random.randint(low=1,high=10,size =(3,3)))

体验normal之前,介绍 matplotlib的hist方法:

plt.hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False)

参数:
x:指定要绘制直方图的数据;
bins:指定直方图条形的个数;
range:指定直方图数据的上下界,默认包含绘图数据的最大值和最小值;
density:是否将直方图的频数转换成频率;
weights:该参数可为每一个数据点设置权重;
cumulative:是否需要计算累计频数或频率;
bottom:可以为直方图的每个条形添加基准线,默认为0;
histtype:指定直方图的类型,默认为bar,除此还有’barstacked’, ‘step’, ‘stepfilled’;
align:设置条形边界值的对其方式,默认为mid,除此还有’left’和’right’;
orientation:设置直方图的摆放方向,默认为垂直方向;
rwidth:设置直方图条形宽度的百分比;
log:是否需要对绘图数据进行log变换;
color:设置直方图的填充色;
label:设置直方图的标签,可通过legend展示其图例;
stacked:当有多个数据时,是否需要将直方图呈堆叠摆放,默认水平摆放
import matplotlib.pyplot as plt

data = np.random.normal(loc=100,scale=1,size=10000)
plt.hist(data,bins = 1000)
plt.show()

1.4  定长分割法

定长分割法最常用的函数是 arange(),另一个定长分割函数 linspace()。

函数原型为:

a = np.arange(0,15,1).reshape((3,5))
print(a)

```python
a = np.arange(0,15,1).reshape((3,5))
print(a)
```

linspace() 函数需要3个参数:一个起点、一个终点,一个返回元素的个数。linspace() 返回的元素包括起点和终点,我们可以通过endpoint参数选择是否包含终点。

numpy提供linspace函数(有时也称为np.linspace)是python中创建数值序列工具。与Numpy arange类似,生成结构与Numpy 数组类似的均匀分布的数值序列

通过定义均匀间隔创建数值序列。其实,需要指定间隔起始点、终止端,以及指定分隔值总数(包括起始点和终止点);最终函数返回间隔类均匀分布的数值序列

endpoint:是否包含end,默认为True(包含)
即:当endpoint = True时, interval = (end-start) / (num-1)
当endpoint = False时,interval = (end-start) / num

dtype:和其他的 NumPy 一样, np.linspace中的dtype 参数决定输出数组的数据类型。如果不指定,python基于其他参数值推断数据类型。如果需要可以显示指定,参数值为NumPy 和 Python支持的任意数据类型。

print(np.linspace(0,10,9,endpoint=True))
print(np.linspace(0,10,9,endpoint=False))

二、创建复杂数组

构造复杂数组可以分为重复构造法和网格构造法两种方法

2.1 重复构造法

重复构造法主要使用 repeat() 和 tile() 两个函数,repeat() 用来重复元素,tile() 用来重复数组。

ar = np.arange(5)
print(np.repeat(ar,2))
print(np.tile(ar,2))
print(np.tile(ar,(5,5))) #重复5行5列

对于多维数组a,repeat() 还有一个默认参数 axis.

a = np.arange(6).reshape((2,3))
print(a)
print(np.repeat(a,2,axis=0))  #重复每行
print(np.repeat(a,2,axis=1))  #重复列

2.2  网格构造法

用数组表示经纬度网格,一般有两种方式。第一种方式,用两个一维数组表示。

lon = np.linspace(-180,180,37) # 网格精度为10°,共计37个经度点
lat = np.linspace(-90,90,19) # 网格精度为10°,共计19个纬度点
print(lon)
print(lat)

第二种方式,则是用 np.meshgrid() 生成两个二维数组,分别表示经度网格、纬度网格。np.meshgrid() 以刚才的两个一维数组 lon 和 lat 为参数,生成的网格精度也是10°。

np.meshgrid(*xi, **kwargs),从坐标向量中返回坐标矩阵,也就是给定坐标的轴点,返回一个坐标网格点,比如给定x:n, y:m,则将返回一个list,第一个元素表示x轴取值,第二个为y轴取值。也就是n×m个坐标点。

lons,lats = np.meshgrid(lon,lat)
print(lons,lats)

a = np.array([1,2,3])
# 坐标向量
b = np.array([7,8])
# 从坐标向量中返回坐标矩阵
# 返回list,有两个元素,第一个元素是X轴的取值,第二个元素是Y轴的取值
res = np.meshgrid(a,b)
print(res)

或者使用mgrid方法直接生成

lats, lons = np.mgrid[-90:91:5., -180:181:5.]  # 网格精度为5°,网格shape为(37,73)
print(lats,lons,sep='\n')

还可以使用虚数定义网格shape:

lats, lons = np.mgrid[-90:90:37j, -180:180:73j] # 也可以用虚实指定分割点数,网格精度同样为5°
print(lats,lons,sep='\n')

2.3  画3D图形

radians() 方法将角度转换为弧度

lats, lons = np.mgrid[-90:91:5., -180:181:5.]
lons = np.radians(lons) # 度转弧度
lats = np.radians(lats) # 度转弧度
z = np.sin(lats) # 网格上所有点的z坐标
x = np.cos(lats)*np.cos(lons) # 网格上所有点的x坐标
y = np.cos(lats)*np.sin(lons) # 网格上所有点的y坐标
ax = plt.subplot(111,projection='3d')
ax.plot_surface(x,y,z,cmap=plt.cm.coolwarm,alpha=0.8)
plt.show()

猜你喜欢

转载自blog.csdn.net/longhaierwd/article/details/131776585