python numpy库/数组

数组和列表的区别:
数组:数组是用于储存多个相同类型数据的集合
列表:一个列表内可包好多种数据类型

数组:一旦创建,指定位置元素不能删除,除非重建数组对象
列表:列表内元素可以删除,删除后,后续元素会前移

数组
库名:numpy 别名:np
安装:pip install numpy
生成的数据类型:<class ‘numpy.ndarray’>

1. ndarray的创建:

方法1.np.arange():
语法结构:arange([start,] stop[, step,], dtype=None)
根据start与stop指定的范围以及step设定的步长,生成一个 ndarray。

特点:arange内部自动实现for循环:Arange函数可自动for循环

#实例1:
import numpy as np
array=np.arange(1,10,3)
print(array)
#输出:
[1 4 7]
#实例2:
import numpy as np
def numpysum(n):
    A=np.arange(n)**2
    B=np.arange(n)**3
    C=A+B
    return C
num=6
summ=numpysum(num)
print(summ)
#输出:
[  0   2  12  36  80 150]

方法2. np.array(list/tuple):

例1:列表中全部是数字
import numpy as np
x=np.array([1,2,3,4,5])
print(x)
#输出:
[1 2 3 4 5]

例2:列表中有数字有字符串,全部当成字符串处理,确保数组中的数据类型一致
import numpy as np
x=np.array([1,'six',3,4,5])
print(x)
#输出:
['1' 'six' '3' '4' '5']

**方法3.numpy.linspace()

功能:在指定的间隔内返回均匀间隔的数字。

语法:np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)**
num:生成数据数量,默认为50
endpoint=True 是否包含endpoint 默认包含
retstep=True,返回生成的array和步长

实例:

import numpy as np
array=np.linspace(1,10,10,endpoint=False,retstep=True)
print(array)
#输出:
(array([1. , 1.9, 2.8, 3.7, 4.6, 5.5, 6.4, 7.3, 8.2, 9.1]), 0.9)

2. numpy的主要方法:

numpy.shape(int/矩阵):读取矩阵长度(矩阵,非数组)

#例1
import numpy as np
print(np.shape([[1,2,3],[4,5,6]]))
输出:
(3,2)#即这是一个三行而裂的矩阵
#例2:
import numpy as np

print(np.shape([[[0,1,2,3],
  [4,5,6,7],
  [8,9,10,11]],

 [[12,13,14,15],
  [16,17,18,19],
  [20,21,22,23]]]))
#输出:
(2, 3, 4)

numpy.reshape():重新定义数组阶数
语法:numpy.reshape(array_like, newshape, order=‘C’)
newshape是一个元祖,元祖参数数量无限制
注意:newshape元祖内数据的乘要等于原数组元素的个数

import numpy as np
a=np.arange(24) #创建一个24位的数组
b=np.array(a)#数组矢量化
c=b.reshape((2,3,4))#分成两组,每组三项,每项4位
print(c)
#输出:
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

numpy.resize(array_like, newshape, order=‘C’):功能和reshape一样,但调用方式不一样,resize是直接修改原数组

import numpy as np
a=np.arange(24) #创建一个24位的数组
b=np.array(a)#数组矢量化
c=b.resize((2,3,4))#分成两组,每组三项,每项4位
print(c)
print(b)
#输出:
None
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

numpy.dtype()定义数据类型
语法: numpy.dtype(obj, align=False, copy=False)
numpy的主要数据类型有:https://wizardforcel.gitbooks.io/ts-numpy-tut/content/3.html

#简单的定义数据类型
import numpy as np
# int8, int16, int32, int64 四种数据类型可以使用字符串 'i1', 'i2','i4','i8' 代替
dt = np.dtype('i4')
print(dt)
#输出:
int32
#将数据类型应用到数组:
import numpy as np
# int8, int16, int32, int64 四种数据类型可以使用字符串 'i1', 'i2','i4','i8' 代替
dt = np.dtype('i8')
array1=np.arange(5)

array2=np.arange(5,dtype=dt)
print(array1.dtype)
print(array2.dtype)
#输出:
int32
int64
#创建结构化的数据类型
import numpy as np
dt = np.dtype([('age',np.int64)])
#将结构化的数据类型应用到结构化的数组中
a=np.array([11,13,15],dtype=dt)
print(a)
print(a.dtype)
#输出:
[(11,) (13,) (15,)]
[('age', '<i8')]
#元组方式定义数据类型
import numpy as np
dt = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
#将数据类型传入数组
student = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = dt) 
print(student)
print(student.dtype)
#输出:
[(b'abc', 21, 50.) (b'xyz', 18, 75.)]
[('name', 'S20'), ('age', 'i1'), ('marks', '<f4')]

补:在结构性数组中查看数据类型
print(student['name'].dtype)
#输出:
|S20

数组的索引和切片:同列表

#一维数组索引
#指定步长:
import numpy as np
a=np.arange(10)
num1=a[0:7:2] #072 分别代表起始位置,结束位置和步长
print(num1)
#输出:
[0 2 4 6]
#多维列表索引
import numpy as np
a=np.arange(24) #创建一个24位的数组
b=np.array(a).reshape((2,3,4))#数组矢量化

m=b[1][1][3]
print(b)
print(m)
#输出:
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
19

numpy.sort()"将数组排序:
语法:numpy.sort(a, axis=-1, kind=‘quicksort’, order=None)
a. 需要排序的数组
axis:按哪条轴排序:axis=1 按列排序,axis=0,按行排序
kind:
kind:数组排序时使用的方法,其中:
kind=′quicksort′kind=′quicksort′为快排;
kind=′mergesort′kind=′mergesort′为混排;
kind=′heapsort′kind=′heapsort′为堆排;
(概念见文末附录)
order:如果数组包含字段,则是要排序的字段

import numpy as np
dt = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
student = np.array([('a', 21, 50),('x', 18, 75),('b', 13, 43),('y', 25, 60)],dtype = dt) 

print(student)
print(np.sort(student,order='age'))
#输出:
[(b'a', 21, 50.) (b'x', 18, 75.) (b'b', 13, 43.) (b'y', 25, 60.)]
[(b'b', 13, 43.) (b'x', 18, 75.) (b'a', 21, 50.) (b'y', 25, 60.)]

numpy.flatten():将多维数组展开成一维数组# 返回的是原数组的拷贝

import numpy as np
a=np.arange(24).reshape(4,6)
print(a)
print(a.flatten())
#输出:
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]

numpy.ravel():将多维数组展开成一维数组

区别:
flatten方法会生成原数组的copy,赋值后原数组不变
ravel不生成copy,赋值后原数组改变

import numpy as np
x = np.array([[1, 2], [3, 4]])
x.flatten()[1] = 100
print(x)

y = np.array([[1, 2], [3, 4]])
y.ravel()[1] = 100
print(y)
#输出:
#flatten
[[1 2]
 [3 4]]
 #ravel
[[  1 100]
 [  3   4]]

numpy.transpose(): 矩阵转置

import numpy as np
a=np.array([["1","2","3","4"],["12","13","14","16"],["23","24","35","46"]])
print(a.transpose())
#输出:
[['1' '12' '23']
 ['2' '13' '24']
 ['3' '14' '35']
 ['4' '16' '46']]

numpy.hstack() 水平组合

import numpy as np
a=np.arange(25)
b=a.reshape(5,5)
c=b+1
m=np.hstack((b,c))#以元组形式传值到hstack
print(m)
#输出
[[ 0  1  2  3  4  1  2  3  4  5]
 [ 5  6  7  8  9  6  7  8  9 10]
 [10 11 12 13 14 11 12 13 14 15]
 [15 16 17 18 19 16 17 18 19 20]
 [20 21 22 23 24 21 22 23 24 25]]

numpy.vstack() 垂直组合

import numpy as np
a=np.arange(12)
c=a.reshape((3,4))
d=c+1
m=np.vstack((c,d))
#print(c,'\n',d)
print(m)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]

numpy.dstack() 深度组合

深度组合 
import numpy as np
a=np.arange(25)
b=a.reshape(5,5)
c=b+1
m=np.dstack((b,c))
print(m)


 ==================
[[[ 0  1]
  [ 1  2]
  [ 2  3]
  [ 3  4]
  [ 4  5]]

 [[ 5  6]
  [ 6  7]
  [ 7  8]
  [ 8  9]
  [ 9 10]]

 [[10 11]
  [11 12]
  [12 13]
  [13 14]
  [14 15]]

 [[15 16]
  [16 17]
  [17 18]
  [18 19]
  [19 20]]

 [[20 21]
  [21 22]
  [22 23]
  [23 24]
  [24 25]]]

numpy.column_stack() 列组合

import numpy as np
a=np.arange(24)
b=a.reshape(4,6)
c=b+1
m=np.column_stack((b,c))
print(m)
 ==================
[[ 0  1  2  3  4  5  1  2  3  4  5  6]
 [ 6  7  8  9 10 11  7  8  9 10 11 12]
 [12 13 14 15 16 17 13 14 15 16 17 18]
 [18 19 20 21 22 23 19 20 21 22 23 24]]

numpy.row_stack行组合

import numpy as np
a=np.arange(24)
b=a.reshape(4,6)
m=np.hsplit(a,6)
print(m)

[array([0, 1, 2, 3]), array([4, 5, 6, 7]), array([ 8,  9, 10, 11]), array([12, 13, 14, 15]), array([16, 17, 18, 19]), array([20, 21, 22, 23])]

附录:

快速排序;quicksort
使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
步骤为:

  1. 从数列中挑出一个元素,称为“基准”(pivot),
  2. 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割(partition)操作。
  3. 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。
    递归到最底部时,数列的大小是零或一,也就是已经排序好了。这个算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

归并/混合排序:mergesort
算法思路:

把 n 个记录看成 n 个长度为 l 的有序子表
进行两两归并使记录关键字有序,得到 n/2 个长度为 2 的有序子表
重复第 2 步直到所有记录归并成一个长度为 n 的有序表为止。
以数组 array = [6, 5, 3, 1, 8, 7, 2, 4] 为例,首先将数组分为长度为 2 的子数组,并使每个子数组有序:
[6, 5] [3, 1] [8, 7] [2, 4]
↓ ↓ ↓ ↓
[5, 6] [1, 3] [7, 8] [2, 4]
然后再两两合并:

1 [6, 5, 3, 1] [8, 7, 2, 4]
2 ↓ ↓
3 [1, 3, 5, 6] [2, 4, 7, 8]
最后将两个子数组合并:

1 [6, 5, 3, 1, 8, 7, 2, 4]
2 ↓
3 [1, 2, 3, 4, 5, 6, 7, 8]

堆排序:heapsort
参考链接:https://www.cnblogs.com/kkun/archive/2011/11/23/2260286.html

猜你喜欢

转载自blog.csdn.net/weixin_44595372/article/details/88057019