4、Numpy 数组的基本操作

4.0.1索引

一维numpy数组与列表完全一致
代码:

li = [[1,2,3,],[4,5,6]]
li

输出:

代码:

li[1][0]

输出:

array索引法

代码:

#array索引法
import numpy as np
arr = np.array(li)
arr

输出:

array支持list和tuple类型的索引

代码:

#arr[y,x]
arr[1,0]

输出:

代码:

arr[[1,1,1]]

输出:
重要!

4.1 重设形状

reshape 可以在不改变数组数据的同时,改变数组的形状。其中,numpy.reshape() 等效于 ndarray.reshape()reshape方法非常简单:
代码:

import matplotlib.pyplot as plt
cat = plt.imread('cat.jpg')
cat.shape

输出:

代码:

456*730*3

输出:

图片的形状进行改变

形状可以改变,但是元素的总量不能改变

二维的时黑白图片,透光率0时黑的,255时白的

代码:

#图片的形状进行改变
#形状可以改变,但是元素的总量不能改变
#二维的时黑白图片,透光率0时黑的,255时白的
plt.imshow(cat.reshape(456,730*3),cmap='gray')

输出:

代码:

#在形状改变中 -1 代表的是剩余的元素总和
cat.reshape(cat.shape[0],-1).shape

输出:

代码:

#将数组展开成一维
cat.reshape(-1)

输出:

代码:

#把数组转换成  多行一列
cat.reshape(-1,1).shape

输出:

4.2.1 数组展开

ravel 的目的是将任意形状的数组扁平化,变为 1 维数组。ravel 方法如下:

不管是几维的数组都会变成1维的数据

cat.ravel()

4. 2.2级联

  1. np.concatenate() 级联需要注意的点:
  2. 级联的参数是列表:一定要加中括号或小括号
  3. 维度必须相同
  4. 形状相符
  5. 【重点】级联的方向默认是shape这个tuple的第一个值所代表的维度方向
  6. 可通过axis参数改变级联的方向,默认为0, (0表示列相连,行发生改变,表示的Y轴的事情,1表示列相连,列发生改变,X轴的事情)
cat2 = cat[:,:,::-1]
#检查形状
cat.shape,cat2.shape

#第一个参数是序列数据类型
#第二个参数是拼接的方向axis=0代表列拼接
plt.imshow(np.concatenate([cat,cat2],axis=0))

4.2.3 numpy.[hstack|vstack]

堆 做级联

分别代表水平级联与垂直级联,填入的参数必须被小括号或中括号包裹

vertical垂直的 horizontal水平的 stack层积

这两个函数的值也是一个list或tuple

plt.imshow(np.vstack([cat,cat2]))

plt.imshow(np.hstack((cat,cat2)))

4.2.4副本

所有赋值运算不会为ndarray的任何元素创建副本。对赋值后的对象的操作也对原来的对象生效。

可使用ndarray.copy()函数创建副本

cat3 = cat.copy()
cat3[0,0,0]=100
cat3

4.2.6 ndarray的聚合函数

1. 累加np.sum

ndarray.sum(axis),axis不写则为所有的元素求和,为0表示行求和,1表示列求和

axis是轴的方向

A = np.random.randint(0,150,(5,3))
A

#行方向进行累加
np.sum(A,axis=1)

A[0].sum()

2. 最大最小值:nd.max/ nd.min

#列中的最大值
A.max(axis=0)

A.min()

3.平均值:nd.mean()

#行方向求平均值
A.mean(axis=1)

灰度化
cat.shape

#彩色图片去除RGB就会变成黑白照片
#图片的行列不能相加
plt.imshow(cat.max(axis=-1),cmap='gray')
#0-255   

#(456, 730, 3)  456:0    730:1    3:2 (-1代表最后一个) 
plt.imshow(cat.min(axis=-1),cmap='gray')

plt.imshow(cat.mean(axis=-1),cmap='gray')

4. 其他聚合操作

Function Name	NaN-safe Version	Description
np.sum	np.nansum	Compute sum of elements
np.prod	np.nanprod	Compute product of elements
np.mean	np.nanmean	Compute mean of elements
np.std	np.nanstd	Compute standard deviation
np.var	np.nanvar	Compute variance
np.min	np.nanmin	Find minimum value
np.max	np.nanmax	Find maximum value
np.argmin	np.nanargmin	Find index of minimum value 找到最小数的下标
np.argmax	np.nanargmax	Find index of maximum value 找到最大数的下标
np.median	np.nanmedian	Compute median of elements
np.percentile	np.nanpercentile	Compute rank-based statistics of elements
np.any	N/A	Evaluate whether any elements are true
np.all	N/A	Evaluate whether all elements are true
np.power square
np.argwhere(nd1<0)
np.bincount



带有nan前缀的函数

#NaN  Javascript     not a number  不是一个数字的数字类型  任何数值+NaN = NaN
#NaN == MySQL当中的Null  就是空数据类型None
np.nan == np.NaN
np.nan+100
B=np.array([np.nan,1,2,3])
B
#带有nan前缀的函数都不会计算nan
np.nanmean(B)

带有arg的函数

#带有arg前缀的函数
C = np.array([1,2,6,4,5,3])
np.max(C)
#返回最大值的索引
np.argmax(C)

where函数

D = np.array([[1,2,3],[4,5,6],[7,8,9]])
D
#condition 条件
#D>5  同等与 每一个元素和5对比
y,x = np.where(D>5)
#返回一个tuple
#索引为0 的位置是y轴坐标
#索引为1的位置是x轴坐标

np.concatenate([y.reshape(-1,1),x.reshape(-1,1)],axis=1)
#直接返回符合条件的坐标
#如果要是使用数组进行条件查询,最好先把数组展开
cond = np.argwhere(D.ravel()>5)
#cond是序列类型,是二维的,也需要展开
cond.ravel()
D.ravel()[cond.ravel()]

换一种条件匹配方式

cond_index = D.ravel()>5
#中括号中只识别条件为True的参数
D.ravel()[cond_index]

计数

np.bincount([2,2,2,2,2,10])
#解读方式是数索引,2出现过5次,10出现过1次,其它数字没出现过