python—Numpy库第一天学习

1基础概念与优缺点

1.1概念:Numpy是python的第三方扩展包,主要用来计算、处理数组

1.2优点:Numpy可以便捷高效地处理大量数据,可以构建多维数组

1.3与列表(list)的区别

Numpy构建数组,必须是同类型数据,list构建列表,不一定需要同类型

2.构建数组

2.1利用array创建数组

二维数组

import numpy as np
arr=np.array([[1,2,3],[4,5,6]],order="c",copy=True,ndmin=2,dtype=np.float64)
print(arr)
'''输出为
[[1. 2. 3.]
 [4. 5. 6.]]
'''

2.1.1array中的属性

order在Numpy库中,函数大多具有此属性)以哪种内存布局创建数组,有C行优先,F列优先,A默认

C的存储方式是按照arr[0,1],arr[0,2],arr[0,3]……方式存储

F的存储方式是按照arr[1,0],arr[2,0],arr[3,0]……方式存储

例如2.1中的例子:C是先存储1,2,3,再存储4,5,6

当改为F时,是先存储1,4再存储2,5最后存储3,6

copy:表示是否能够复制,默认为可复制(Ture),不可复制为False

ndmin:用于指定数据维度

维度可以理解为:数据外有几个[],就是几维:例如以上二维数组:[[1,2,3],[4,5,6]]表示二维数组,但维度序号是0,1。

dtype:表示数组的数据类型,有整数(int)、小数(浮点数)(float)、虚数(complex)8个字节为一个字符,如:int8,int16,float8,float16,complex64…..也可以缩写:i1,i2

f1,f2,c8….S表示字节串,a表示字符串如S8,a8

2.2利用empty创建数组

import numpy as np
arr=np.empty(shape=(2,3),dtype='i1',order='C')
print(arr)

此为创建一个二行三列的只有一个字符的整数数组

shape:表示创建数组的形状

但empty创建数组,数组里的元素是随机的

2.3zeros与ones创建数组

import numpy as np
arr=np.zeros(shape=(2,3),dtype='i1',order='C')
print(arr)
'''
输出为
[[0 0 0]
 [0 0 0]]
'''

与前empty创建不同的点为:用zeros创建,元素都为0

用ones创建,元素都为1

import numpy as np
arr=np.ones(shape=(2,3),dtype='i1',order='C')
print(arr)
'''
输出为
[[1 1 1]
 [1 1 1]]
'''

2.4arange创建数组

import numpy as np
arr1=np.arange(1,10,2,dtype='i1')
print(arr1)
'''
输出为:
[1 3 5 7 9]
'''

arange创建数组,就是从开始到结束(不包含)利用步长生成数组,步长默认为1,上图中的是(开始,截止,步长,数据类型)从1开始,到10结束,不包含10,步长为2

2.5linspace

import numpy as np
arr1,step=np.linspace(1,10,4,endpoint=True,retstep=True,dtype='i1')
print(step)
print(arr1)
'''
输出为:
3.0
[ 1  4  7 10]
'''

与arange创建数组相似,但最后一位是产生的数量,也就是说把1到10平均分成4份,默认是50份。

endpoint:默认为 True,表示数列包含 stop 终止值,反之不包含

retstep:表示是否返回步长。如果为 True,则返回一个包含数组和步长的元组;如果为 False,则只返回数组。默认为 False。

2.6full创建数组

import numpy as np
arr1=np.full((1,3),4,dtype='i1',order="c")
print(arr1)
'''
输出为:
[[4 4 4]]
'''

full与zeros、ones等类似,首先是要生成的数组形状(1,3)一行三列,其次是4,表示用4填充

ful_like也是一样,但最开始要输入生成数组的形状变成了,需要生成数组与其他数组形状一样的数组,例如:

import numpy as np
arr1=np.full((1,3),4,dtype='i1',order="c")
arr2=np.full_like(arr1,5)
print(arr2)
'''
输出为:
[[5 5 5]]
'''

3查看数组

3.1利用属性查看数组

3.1.1查看数组形状

利用shape属性查看

import numpy as np
arr=np.ones(shape=(2,3),dtype='i1',order='C')
print(arr.shape)
'''
输出为
(2, 3)
'''

此表示创建的数组为两行三列

3.1.2查看数组维度

利用ndim查看维度,记住:此属性关键词为ndim与设定维度ndmin关键词有所不同

import numpy as np
arr=np.ones(shape=(2,3),dtype='i1',order='C')
print(arr.ndim)
'''
输出为:
2
'''

表示生成的二维数组

3.1.3查看数组中元素的大小

itemsize查看数组中每个元素的大小,也就是字符数,字节为8表示一个字符数

    array_one = np.array([[1,2,3],[4,5,6]],dtype=np.int8)
    print('array_one 数组中每个元素的大小:',array_one.itemsize)	#输出:1

表示每个元素只有一个字符

3.1.3查看内存信息

array_one = np.array([[1,2,3],[4,5,6]])
print('array_one 数数组的内存信息:\n',array_one.flags)
'''
输出:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
'''

C_CONTIGUOUS:表示数组在内存中是 C 风格连续的(行优先)。如果为 True,则数组是 C 风格连续的。

F_CONTIGUOUS:表示数组在内存中是 Fortran 风格连续的(列优先)。如果为 True,则数组是 Fortran 风格连续的。

OWNDATA:表示数组是否拥有自己的数据(即是否是视图)。如果为 True,则数组拥有自己的数据;如果为 False,则数组可能是从另一个数组或对象借用数据的。

WRITEABLE:表示数组是否可写。如果为 True,则数组是可写的;如果为 False,则数组是只读的。

ALIGNED:
表示数组是否对齐。
如果为 True,则数组的数据在内存中是对齐的。

WRITEBACKIFCOPY:
表示数组是否是通过 np.copy 创建的副本,并且需要将更改写回原始数组。
如果为 True,则数组是通过 np.copy 创建的副本,并且需要将更改写回原始数组。

UPDATEIFCOPY:表示数组是否是通过 np.copy 创建的副本,并且需要将更改写回原始数组。
如果为 True,则数组是通过 np.copy 创建的副本,并且需要将更改写回原始数组。

3.2查看数组元素

3.2.1一维数组

一维数组可以直接利用for循环查看每个元素:

import numpy as np
arr=np.array([1,2,3,4,5,6],dtype='i1',order='C')
for i in arr:
    print(i)
'''
输出为:
1
2
3
4
5
6
'''

3.2.2一维及多维元组元素查看

3.2.2.1利用flat查看

import numpy as np
arr=np.array([[1,2,3],[4,5,6]],dtype='i1',order='C')
for i in arr.flat:
    print(i)
'''
输出为:
1
2
3
4
5
6
'''

flat返回一个迭代器,会将数组视为一个扁平化的一维数组,按行优先的顺序遍历所有元素。

3.2.2.2利用flatten查看

import numpy as np
arr=np.array([[1,2,3],[4,5,6]],dtype='i1',order='C')
print(arr.flatten(order="C"))
'''
输出为:
[1 2 3 4 5 6]
'''

其中order可以选的:C:按行优先顺序展开(默认),F:按列优先顺序展开。A:如果原数组是 Fortran 连续的,则按列优先顺序展开;否则按行优先顺序展开。K:按元素在内存中的顺序展开。

3.2.2.3利用ravel查看

import numpy as np
arr=np.array([[1,2,3],[4,5,6]],dtype='i1',order='C')
print(arr.ravel(order="C"))
'''
输出为:
[1 2 3 4 5 6]
'''

与flatten相似,但ravel是视图,flatten是副本,也就是说:ravel中某个元素改变,原数组的那个元素也改变,但flatten不会影响原数组

3.2.2.4bool索引

返回True或False

例如:

import numpy as np
arr=np.array([[1,2,3],[4,5,6],[7,8,9]],dtype='i1',order='C')
bool_dix=arr>5
print(bool_dix)
print("====")
print(arr[bool_dix])
'''
输出为:
[[False False False]
 [False False  True]
 [ True  True  True]]
====
[6 7 8 9]
'''

数组[bool类型的索引]会返回满足条件的列表

3.3切片查看

3.3.1一维数组查看

利用slice函数从原数组中切割一个新数组

import numpy as np
arr=np.array([1,2,3,4,5,6],dtype='i1',order='C')
result=slice(0,len(arr),2)
print(arr[result])
'''
输出为:
[1 3 5]
'''

slice((开始,截止),步长)与创建函数的arange相似

3.3.2一维与多维函数

利用[]经行切片

import numpy as np
arr=np.array([[1,2,3],[4,5,6]],dtype='i1',order='C')
print(arr[0,1])
print(arr[0:,1])
print(arr[:1,1])
print(arr[1:2, 1:2])
'''
输出为:
2
[2 5]
[2]
[[5]]
'''

类似与列表切片,但元组切片中间是“,”号“:”表示以后,如以上的print(arr[0:,1])表示,索引行为0及以后行的索引为1的列元素

一维函数还可以利用“::”表示步长例:

import numpy as np
arr1=np.array([1,2,3,4,5,6],dtype='i1',order='C')
print(arr1[::2])
'''
输出为:
[1 3 5]
'''

4改变数组

4.1改变数组形状

4.1.1reshape

import numpy as np
arr1=np.array([1,2,3,4,5,6],dtype='i1',order='C')
print(arr1)
print(arr1.reshape(2,3))
print(arr1)
'''
输出为:
[1 2 3 4 5 6]
[[1 2 3]
 [4 5 6]]
[1 2 3 4 5 6]
'''

reshape属性,不会改变原数组的数据形状,但reshape的元素改变,原数组的对应元素也会改变

4.1.2shape

import numpy as np
arr1=np.array([1,2,3,4,5,6],dtype='i1',order='C')
print(arr1)
arr1.shape=(2,3)
print(arr1)
'''
输出为:
][1 2 3 4 5 6]
[[1 2 3]
 [4 5 6]]
'''

shape是直接改变原数组的数组形状

4.2数组转置

transpose与.T方法是相同的,都是把原数组进行转置

import numpy as np
arr1=np.array([[1,2],[3,4]],dtype='i1',order='C')
arr2=np.array([[5,6],[7,8]],dtype='i1',order='C')
print(np.transpose(arr1))
print("=====")
print(arr2.T)
'''
输出为:
[[1 3]
 [2 4]]
=====
[[5 7]
 [6 8]]
'''

4.3改变数组维度

4.3.1利用expand_dims添加维度

import numpy as np
arr1=np.array([[1,2],[3,4]],dtype='i1',order='C')

print(arr1)
print("===")
print(np.expand_dims(arr1,0))
'''
输出为:
[[1 2]
 [3 4]]
===
[[[1 2]
  [3 4]]]
'''

如上图所示:expand_dims(arr1,0)在索引为0前加一维度,但不会改变原维度,但如果元素改变了,原数组也会改变

4.3.2利用aqueeze渐少维度

import numpy as np
arr1=np.array([[[1,2],[3,4]]],dtype='i1',order='C')
print(arr1)
print("===")
print(np.squeeze(arr1,0))
'''
输出为:
[[[1 2]
  [3 4]]]
===
[[1 2]
 [3 4]]
'''

与expand_dims相似

4.3.3newaxis

它通常用于将一维数组转换为二维数组,或者在其他情况下增加数组的维度。

import numpy as np
arr1=np.array([1,2,3,4],dtype='i1',order='C')
print(arr1[:,np.newaxis])
print("===")
print(arr1[np.newaxis,:])
'''
输出为:
[[1]
 [2]
 [3]
 [4]]
===
[[1 2 3 4]]
'''

4.4连接数组

4.4.1hstack(水平堆叠)

import numpy as np
arr1=np.array([1,2,3,4,5,6],dtype='i1',order='C')
arr2=np.array([7,8,9],dtype='i1',order='C')
print(np.hstack((arr1,arr2)))
'''
输出为:
[1 2 3 4 5 6 7 8 9]
'''

hstack简单来说就是吧行数相同的数组直接加到前数组中去

4.4.2vstack(垂直堆叠)

import numpy as np
arr1=np.array([[1,2,3],[4,5,6]],dtype='i1',order='C')
arr2=np.array([[7,8,9],[10,11,12]],dtype='i1',order='C')
print(np.vstack((arr1,arr2)))
'''
输出为:
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
'''

vstack简单来说就是把列数相同的数组,直接把后一个数组放到前数组的后面

4.5数组分割

4.5.1hsplit

import numpy as np
arr1=np.array([[1,2,3],[4,5,6]],dtype='i1',order='C')
for i in np.hsplit(arr1,(1,2)):
    print(i)
    print("===")
'''
输出为:
[[1]
 [4]]
===
[[2]
 [5]]
===
[[3]
 [6]]
===
'''

hsplit就是按列索引分割,(索引是从0开始的)如上面(1,2)就是把列索引为1前面的分为一组(不包含1),再从列索引为2(不包含2)分割开

4.5.2vsplit

import numpy as np
arr1=np.array([[1,2,3],[4,5,6],[7,8,9]],dtype='i1',order='C')
for i in np.vsplit(arr1,(1,2)):
    print(i)
    print("===")
'''
输出为:
[[1 2 3]]
===
[[4 5 6]]
===
[[7 8 9]]
===
'''

与hsplit相似,但hsplit是按照行索引分割的

5矩阵计算

5.1广播计算

当数组加上一个数组时,但他们的形状不同时,行或列较少的数组会广播自己,使自己和较长数组形状相同

import numpy as np
arr1=np.array([[1,2,3],[4,5,6]],dtype='i1',order='C')
arr2=np.array([1,2,3],dtype='i1',order='C')
print(arr1+arr2)
'''
输出为:
[[2 4 6]
 [5 7 9]]
'''

例如以上数组相加:arr2因为比较短,所以广播自己使自己变成与arr1相同形状变成了arr2=[[1,2,3],[1,2,3]]最后相加,此方法只能用在多为加一维数组,且一维的列数与多维的相等

当加实数时,也是把实数广播进行加减

import numpy as np
arr1=np.array([[1,2,3],[4,5,6]],dtype='i1',order='C')
print(arr1+1)
'''
输出为:
[[2 3 4]
 [5 6 7]]
'''

先是把1广播维[[1,1,1],[1,1,1]]然后再经行计算

5.2自身计算(必须行和列相等)

利用linalg.det函数经行计算

import numpy as np
arr1=np.array([[1,2],[4,5]],dtype='i1',order='C')
print(np.linalg.det(arr1))
'''
输出为:
-2.9999999999999996
'''

5.3一维或二维矩阵相乘

利用dot函数经行

import numpy as np
arr1=np.array([1,2],dtype='i1',order='C')
arr2=np.array([3,4],dtype='i1',order='C')
print(np.dot(arr1,arr2))
'''
输出为:
11
'''

一维与一维矩阵相乘时,为点积运算,就是对应相乘相加,如上图为:1X3+2X4=11

多维乘多维时,为矩阵乘法运算:

import numpy as np
arr1=np.array([[1,2],[3,4]],dtype='i1',order='C')
arr2=np.array([[5,6],[7,8]],dtype='i1',order='C')
print(np.dot(arr1,arr2))
'''
输出为:
[[19 22]
 [43 50]]
'''

matmul是专门用于矩阵乘法的函数

import numpy as np
arr1=np.array([[1,2],[3,4]],dtype='i1',order='C')
arr2=np.array([[5,6],[7,8]],dtype='i1',order='C')
print(np.matmul(arr1,arr2))
'''
输出为:
[[19 22]
 [43 50]]
'''

 

 

作者:2301_78324739

物联沃分享整理
物联沃-IOTWORD物联网 » python—Numpy库第一天学习

发表回复