pythonnumpy矩阵详解_Python numpy详解

一、Numpy介绍

一个强大的N维数组对象

支持大量的数据运算

集成C / C++和Fortran代码的工具

众多机器学习框架的基础库(Scipy/Pandas/scikit-learn/Tensorflow)

numpy在存储数据的时候,数据与数据的地址都是连续的,这样就给我们操作带来了好处,处理速度快。在计算机内存里是存储在一个连续空间上的,而对于这个连续空间,我们如果创建 Array 的方式不同,在这个连续空间上的排列顺序也有不同。

创建array的默认方式是 “C-type” 以 row 为主在内存中排列

如果是 “Fortran” 的方式创建的,就是以 column 为主在内存中排列

二、numpy属性

1、ndarray   N维数组类型

数组属性

属性名字属性解释

ndarray.shape

数组维度的元组

ndarray.flags

有关阵列内存布局的信息

ndarray.ndim

数组维数

ndarray.size

数组中的元素数量

ndarray.itemsize

一个数组元素的长度(字节)

ndarray.nbytes

数组元素消耗的总字节数

数组类型,dtype是numpy.dtype类型

名称描述简写

np.bool

用一个字节存储的布尔类型(True或False)

'b'

np.int8

一个字节大小,-128 至 127

'i'

np.int16

整数,-32768 至 32767

'i2'

np.int32

整数,-2 31 至 2 32 -1

'i4'

np.int64

整数,-2 63 至 2 63 - 1

'i8'

np.uint8

无符号整数,0 至 255

'u'

np.uint16

无符号整数,0 至 65535

'u2'

np.uint32

无符号整数,0 至 2 ** 32 - 1

'u4'

np.uint64

无符号整数,0 至 2 ** 64 - 1

'u8'

np.float16

半精度浮点数:16位,正负号1位,指数5位,精度10位

'f2'

np.float32

单精度浮点数:32位,正负号1位,指数8位,精度23位

'f4'

np.float64

双精度浮点数:64位,正负号1位,指数11位,精度52位

'f8'

np.complex64

复数,分别用两个32位浮点数表示实部和虚部

'c8'

np.complex128

复数,分别用两个64位浮点数表示实部和虚部

'c16'

np.object_

python对象

'O'

np.string_

字符串

'S'

np.unicode_

unicode类型

'U'

#创建一个数组

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

b= np.array([1,2,3,4])

c= np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])#类型,大小,字节数

a.dtype #dtype('int64')

a.size #元素的个数 6

a.nbytes #总字节数 48

a.itemsize #一个元素的长度

#形状比较#1维形状 (4,)#2维形状 (2,3)#3维形状 (2, 2, 3)

a.shape #(2, 3)

b.shape #( 4,)

c.shape #(2, 2, 3)

aa= np.array([[1,2,3],[4,5,6]], dtype=np.float32)

aa.dtype#dtype('float32')

#创建数组的时候指定类型

arr = np.array(['python','tensorflow','scikit-learn','numpy'],dtype =np.string_)

arr.dtype#array([b'python', b'tensorflow', b'scikit-learn', b'numpy'], dtype='|S12')

2、数据基本操作

2.1 创建0和1的数组

zero = np.zeros([3, 4])

array([[ 0., 0., 0., 0.],

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

[ 0., 0., 0., 0.]])

ones= np.ones([3,4])

array([[1,1, 1, 1]

[1,1, 1, 1]

[1,1, 1, 1]])

2.2 利用已有数组创建

#源码

def asarray(a, dtype=None, order=None):return array(a, dtype, copy=False, order=order)

a= np.array([[1,2,3],[4,5,6]])#从现有的数组当中创建,默认设置copy=True

a1 =np.array(a)#相当于索引的形式,并没有真正的创建一个新的,默认设置copy=False

a2 =np.asarray(a)#np.asanyarray 会返回 ndarray 或者ndarray的子类,而np.asarray 只返回 ndarray.

a3 = np.asanyarray(a)

2.3创建固定范围的数组

#np.linspace (start, stop, num, endpoint, retstep, dtype) 生成等间隔的序列#start 序列的起始值#stop 序列的终止值,#如果endpoint为true,该值包含于序列中#num 要生成的等间隔样例数量,默认为50#endpoint 序列中是否包含stop值,默认为ture#retstep 如果为true,返回样例,以及连续数字之间的步长#dtype 输出ndarray的数据类型

#生成等间隔的数组

np.linspace(0, 100, 10)#一个参数 默认起点0,步长为1 输出:[0 1 2]

a = np.arange(3)#两个参数 默认步长为1 输出[3 4 5 6 7 8]

a = np.arange(3,9)#三个参数 起点为0,终点为4,步长为0.1

a = np.arange(0, 3, 0.1)

2.4创建随机数组

#创建均匀分布的数组#0~1

print(np.random.rand(10)) #[0.1316822 0.14809709 0.1721296 0.31960958 0.45602859 0.23868581

0.3029913 0.13963264 0.34909405 0.16349485]#默认范围一个数

print(np.random.uniform(0, 100)) #79.1599055190787

#随机整数

print(np.random.randint(10)) #6

#正态分布

print(np.random.normal(0,1, (5, 10)))

2.5数据操作

arr = np.random.normal(0,1, (5, 10))

arr.shape#(5, 10)#获取第一个数据的前5个数据

arr[0, 0:5] #[-0.16934799 1.42139779 -0.42300578 0.87905768 -0.09310058]

#通过索引获取数据

arr[0, 0, 1]#修改形状

reshape:有返回值,所谓有返回值,即不对原始多维数组进行修改;

resize:无返回值,所谓无返回值,即会对原始多维数组进行修改;#让arr的行与arr列反过来#在转换形状的时候,一定要注意数组的元素匹配

arr.reshape([10, 5]) #返回新数组

arr.resize([10,5]) #修改原数组

#修改类型#ndarray.astype(type)

arr.reshape([10, 5]).astype(np.int32)#修改小数位数#ndarray.round(arr, out) Return a with each element rounded to the given number of decimals.

np.round(arr[:2, :5], 4)#数组转换

arr.shape #(5,10)

arr.T.shape #(10,5)

#将arr转换成bytes

arr.tostring()

3、逻辑运算

#逻辑判断

temp > 0.5

#赋值

temp[temp > 0.5] = 1

3.1通用函数

#np.all()#判断[0:2,0:5]是否全是大于0的

np.all(arr[0:2,0:5] > 0) #返回False/True

#np.unique()#返回新的数组的数值,不存在重复的值

#将序列中数值值唯一且不重复的值组成新的序列

change_int = arr[0:2,0:5].astype(int)

np.unique(change_int)

3.2 np.where(三元运算符)

#通过使用np.where能够进行更加复杂的运算

np.where()

np.where(temp> 0, 1, 0) #把t中小于0的替换成0,其他的替换成1.

#复合逻辑需要结合np.logical_and和np.logical_or使用#判断大于0.5并且小于1的,换为1,否则为0

np.where(np.logical_and(temp > 0.5, temp < 1), 1, 0)#判断 大于0.5或者小于-0.5的,换为1,否则为0

np.where(np.logical_or(temp > 0.5, temp < -0.5), 1, 0)

4、统计运算

min(a[, axis, out, keepdims]) Return the minimum of an array or minimum along an axis.

max(a[, axis, out, keepdims]) Return the maximum of an array or maximum along an axis.

median(a[, axis, out, overwrite_input, keepdims]) Compute the median along the specified axis.

mean(a[, axis, dtype, out, keepdims]) Compute the arithmetic mean along the specified axis.

std(a[, axis, dtype, out, ddof, keepdims]) Compute the standard deviation along the specified axis.

var(a[, axis, dtype, out, ddof, keepdims]) Compute the variance along the specified axis.

#axis 轴的取值并不一定,Numpy中不同的API轴的值都不一样,在这里,axis 0代表列, axis 1代表行去进行统计

np.max(arr, axis=1)

np.min(arr, axis=1)

np.std(arr, axis=1)

np.mean(arr, axis=1)#获取变化最大

np.argmax(arr, axis=1)

np.argmax(arr, axis=0)

5、数据间运算

当操作两个数组时,numpy会逐个比较它们的shape(构成的元组tuple),只有在下述情况下,两个数组才能够进行数组与数组

维度相等

shape(其中相对应的一个地方为1)

例如

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

arr2= np.array([[1], [3]])

6、矩阵运算

矩阵,英文matrix,和array的区别矩阵必须是2维的,但是array可以是多维的。

np.mat()

将数组转换成矩阵类型

6.1 矩阵乘法运算

在进行矩阵运算的时候,可以直接使用一个乘法运算API

mp.matmul

a = np.array([[80,86],

[82,80],

[85,78],

[90,90],

[86,82],

[82,90],

[78,80],

[92,94]])

b= np.array([[0.7],[0.3]])

ab=np.matmul(a, b)print(ab)

7、合并、分割

合并:

numpy.concatenate((a1, a2, ...), axis=0)

numpy.hstack(tup) Stack arrays in sequence horizontally (column wise).

numpy.vstack(tup) Stack arrays in sequence vertically (row wise).

arr = np.random.normal(0,1,(6,10))

arr1= arr[:2,:5]

arr2= arr[2:4,:5]#axis=0时候,按照数组的行方向拼接在一起 相当于vstack

arr12 = np.concatenate([arr1, arr2], axis=0)print(arr12)#axis=1时候,按照数组的列方向拼接在一起 相当于hstack

arr21 = np.concatenate([arr1, arr2], axis=1)print(arr21)#np.hstack([arr1, arr2])#np.vstack([arr1, arr2])

分割:

numpy.split(ary, indices_or_sections, axis=0) Split an array into multiple sub-arrays.

arr = np.random.normal(0,1,(6,10))

arr1= arr[:2,:5]

arr2= arr[2:4,:5]#axis=0时候,按照数组的行方向拼接在一起 相当于vstack

arr12 = np.concatenate([arr1, arr2], axis=0)print(arr12)#arr12 = [[ 2.36101473 0.59607656 0.05558251 1.76005188 -1.09546167]

[-0.0909139 -2.4578533 0.03143425 -0.92920756 -0.75200382]

[-0.78871339 -0.16194897 -0.6846899 0.26065397 -0.46875865]

[0.58308561 0.3746763 0.71939439 -0.08448596 -1.78409148]]

aa= np.split(arr12,4,axis=0) #分割成四个数组,按行切割

aa= np.split(arr12,5,axis=0) #分割成五个数组,按列切割

8、IO操作与数据处理

Numpy读取

genfromtxt(fname[, dtype, comments, ...])   Load data from a text file, with missing values handled as specified.

测试数据,test.csv文件内容

importnumpy as np

test= np.genfromtxt("test.csv", delimiter=',')

test#当我们读取本地的文件为float的时候,如果有缺失(或者为None),就会出现nan

#结果array([[ nan, nan, nan, nan],

[1. , 123. , 1.4, 23. ],

[2. , 110. , nan, 18. ],

[3. , nan, 2.1, 19. ]])

test.shape#(4,4)

type(np.nan) #float#numpy不适合数据处理,pandas工具比较合适

你可能感兴趣的:(pythonnumpy矩阵详解)