赞
踩
四阶:机器学习 - 深度学习
Numerical Python,数值的 Python,补充了 Python 语言所欠缺的数值计算能力。
Numpy 是其它数据分析及机器学习库的底层库。
Numpy 完全标准 C 语言实现,运行效率充分优化。
Numpy 开源免费。
1995 年,Numeric,Python 语言数值计算扩充。
2001 年,Scipy->Numarray,多维数组运算。
2005 年,Numeric+Numarray->Numpy。
2006 年,Numpy 脱离 Scipy 成为独立的项目。
代码简洁:减少 Python 代码中的循环。
底层实现:厚内核(C)+薄接口(Python),保证性能。
元数据(metadata):
实际数据:
完整的数组数据
将实际数据与元数据分开存放,一方面提高了内存空间的使用效率,另一方面减少对实际数据的访问频率,提高性能。
Numpy 数组是同质数组,即所有元素的数据类型必须相同
Numpy 数组的下标从 0 开始,最后一个元素的下标为数组长度减 1
np.array(任何可被解释为 Numpy 数组的逻辑结构)
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])
print(a) # [1 2 3 4 5 6]
np.arange(起始值(0),终止值,步长(1))
import numpy as np
a = np.arange(0, 5, 1)
print(a) # [0 1 2 3 4]
b = np.arange(0, 10, 2)
print(b) # [0 2 4 6 8]
np.zeros(数组元素个数, dtype=‘类型’)
import numpy as np
a = np.zeros(10)
print(a) # [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
np.ones(数组元素个数, dtype=‘类型’)
import numpy as np
a = np.ones(10)
print(a) # [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
数组的维度: np.ndarray.shape
import numpy as np
ary = np.array([1, 2, 3, 4, 5, 6])
print(type(ary), ary, ary.shape) # <class 'numpy.ndarray'> [1 2 3 4 5 6] (6,)
#二维数组
ary = np.array([
[1,2,3,4],
[5,6,7,8]
])
print(type(ary), ary, ary.shape)
"""
<class 'numpy.ndarray'> [[1 2 3 4]
[5 6 7 8]] (2, 4)
"""
元素的类型: np.ndarray.dtype
import numpy as np
ary = np.array([1, 2, 3, 4, 5, 6])
print(type(ary), ary, ary.dtype) # <class 'numpy.ndarray'> [1 2 3 4 5 6] int64
#转换ary元素的类型
b = ary.astype(float)
print(type(b), b, b.dtype) # <class 'numpy.ndarray'> [1. 2. 3. 4. 5. 6.] float64
#转换ary元素的类型
c = ary.astype(str)
print(type(c), c, c.dtype) # <class 'numpy.ndarray'> ['1' '2' '3' '4' '5' '6'] <U21
数组元素的个数: np.ndarray.size
import numpy as np
ary = np.array([
[1,2,3,4],
[5,6,7,8]
])
#观察维度,size,len的区别
print(ary.shape, ary.size, len(ary)) # (2, 4) 8 2
数组元素索引(下标)
数组对象[…, 页号, 行号, 列号]
下标从 0 开始,到数组 len-1 结束。
import numpy as np a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) print(a, a.shape) print(a[0]) print(a[0][0]) print(a[0][0][0]) print(a[0, 0, 0]) for i in range(a.shape[0]): for j in range(a.shape[1]): for k in range(a.shape[2]): print(a[i, j, k]) """ [[[1 2] [3 4]] [[5 6] [7 8]]] (2, 2, 2) [[1 2] [3 4]] [1 2] 1 1 1 2 3 4 5 6 7 8 """
Numpy 的内部基本数据类型
类型名 | 类型表示符 |
---|---|
布尔型 | bool_ |
有符号整数型 | int8(-128~127) / int16 / int32 / int64 |
无符号整数型 | uint8(0~255) / uint16 / uint32 / uint64 |
浮点型 | float16 / float32 / float64 |
复数型 | complex64 / complex128 |
字串型 | str_,每个字符用 32 位 Unicode 编码表示 |
日期类型 | datetime64 |
自定义复合类型
列与列之间可以是不同的类型,但是在同一列内,类型必须
# 自定义复合类型 import numpy as np data=[ ('zs', [90, 80, 85], 15), ('ls', [92, 81, 83], 16), ('ww', [95, 85, 95], 15) ] #第一种设置dtype的方式 a = np.array(data, dtype='U3, 3int32, int32') print(a) print(a[0]['f0'], ":", a[1]['f1']) print("=====================================") #第二种设置dtype的方式 c = np.array(data, dtype={'names': ['name', 'scores', 'ages'], 'formats': ['U3', '3int32', 'int32']}) print(c[0]['name'], ":", c[0]['scores'], ":", c.itemsize) print("=====================================") #测试日期类型数组 f = np.array(['2011', '2012-01-01', '2013-01-01 01:01:01','2011-02-01']) f = f.astype('M8[D]') f = f.astype('i4') print(f[3]-f[0]) f.astype('bool') """ [('zs', [90, 80, 85], 15) ('ls', [92, 81, 83], 16) ('ww', [95, 85, 95], 15)] zs : [92 81 83] ===================================== zs : [90 80 85] : 28 ===================================== 31 """
类型字符码
类型 | 字符码 |
---|---|
np.bool_ | ? |
np.int8/16/32/64 | i1 / i2 / i4 / i8 |
np.uint8/16/32/64 | u1 / u2 / u4 / u8 |
np.float/16/32/64 | f2 / f4 / f8 |
np.complex64/128 | c8 / c16 |
np.str_ | U |
np.datetime64 | M8[Y] M8[M] M8[D] M8[h] M8[m] M8[s] |
视图变维(数据共享): reshape() 与 ravel()
import numpy as np a = np.arange(1, 9) print(a) # [1 2 3 4 5 6 7 8] b = a.reshape(2, 4) #视图变维 : 变为2行4列的二维数组 print(b) c = b.reshape(2, 2, 2) #视图变维 变为2页2行2列的三维数组 print(c) d = c.ravel() #视图变维 变为1维数组 print(d) """ [1 2 3 4 5 6 7 8] [[1 2 3 4] [5 6 7 8]] [[[1 2] [3 4]] [[5 6] [7 8]]] [1 2 3 4 5 6 7 8] """
复制变维(数据独立): flatten()
e = c.flatten()
print(e)
a += 10
print(a, e, sep='\n')
"""
[1 2 3 4 5 6 7 8]
[11 12 13 14 15 16 17 18]
[1 2 3 4 5 6 7 8]
"""
就地变维:直接改变原数组对象的维度,不返回新数组
a.shape = (2, 4)
print(a)
a.resize(2, 2, 2)
print(a)
"""
[[11 12 13 14]
[15 16 17 18]]
[[[11 12]
[13 14]]
[[15 16]
[17 18]]]
"""
数组对象切片的参数设置与列表切面参数类似
数组对象[起始位置:终止位置:步长, …]
三维数组[页的索引,行的索引,列的索引]
三维数组[页的切片,行的切片,列的切片]
import numpy as np
a = np.arange(1, 10)
print(a) # 1 2 3 4 5 6 7 8 9
print(a[:3]) # 1 2 3
print(a[3:6]) # 4 5 6
print(a[6:]) # 7 8 9
print(a[::-1]) # 9 8 7 6 5 4 3 2 1
print(a[:-4:-1]) # 9 8 7
print(a[-4:-7:-1]) # 6 5 4
print(a[-7::-1]) # 3 2 1
print(a[::]) # 1 2 3 4 5 6 7 8 9
print(a[:]) # 1 2 3 4 5 6 7 8 9
print(a[::3]) # 1 4 7
print(a[1::3]) # 2 5 8
print(a[2::3]) # 3 6 9
多维数组的切片操作
import numpy as np a = np.arange(1, 28) a.resize(3,3,3) print(a) #切出1页 print(a[1, :, :]) #切出所有页的1行 print(a[:, 1, :]) #切出0页的1行1列 print(a[0, :, 1]) """ [[[ 1 2 3] [ 4 5 6] [ 7 8 9]] [[10 11 12] [13 14 15] [16 17 18]] [[19 20 21] [22 23 24] [25 26 27]]] [[10 11 12] [13 14 15] [16 17 18]] [[ 4 5 6] [13 14 15] [22 23 24]] [2 5 8] """
ndarray 数组的掩码操作
import numpy as np
a = np.arange(1, 10)
mask = [True, False,True, False,True, False,True, False,True]
print(a[mask]) # [1 3 5 7 9]
垂直方向操作:
import numpy as np a = np.arange(1, 7).reshape(2, 3) b = np.arange(7, 13).reshape(2, 3) # 垂直方向完成组合操作,生成新数组 c = np.vstack((a, b)) # 垂直方向完成拆分操作,生成两个数组 d, e = np.vsplit(c, 2) print(a) print(b) print(c) print(d) print(e) """ [[1 2 3] [4 5 6]] [[ 7 8 9] [10 11 12]] [[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]] [[1 2 3] [4 5 6]] [[ 7 8 9] [10 11 12]] """
水平方向操作:
import numpy as np a = np.arange(1, 7).reshape(2, 3) b = np.arange(7, 13).reshape(2, 3) # 水平方向完成组合操作,生成新数组 c = np.hstack((a, b)) # 水平方向完成拆分操作,生成两个数组 d, e = np.hsplit(c, 2) print(a) print(b) print(c) print(d) """ [[1 2 3] [4 5 6]] [[ 7 8 9] [10 11 12]] [[ 1 2 3 7 8 9] [ 4 5 6 10 11 12]] [[1 2 3] [4 5 6]] [[ 7 8 9] [10 11 12]] """
深度方向操作:(3 维)
import numpy as np a = np.arange(1, 7).reshape(2, 3) b = np.arange(7, 13).reshape(2, 3) # 深度方向(3维)完成组合操作,生成新数组 i = np.dstack((a, b)) # 深度方向(3维)完成拆分操作,生成两个数组 k, l = np.dsplit(i, 2) """ [[1 2 3] [4 5 6]] [[ 7 8 9] [10 11 12]] [[[ 1 7] [ 2 8] [ 3 9]] [[ 4 10] [ 5 11] [ 6 12]]] [[[1] [2] [3]] [[4] [5] [6]]] [[[ 7] [ 8] [ 9]] [[10] [11] [12]]] """
多维数组组合与拆分的相关函数:
# 通过axis作为关键字参数指定组合的方向,取值如下: # 若待组合的数组都是二维数组: # 0: 垂直方向组合 # 1: 水平方向组合 # 若待组合的数组都是三维数组: # 0: 垂直方向组合 # 1: 水平方向组合 # 2: 深度方向组合 res = np.concatenate((a, b), axis=0) print(res) # 通过给出的数组与要拆分的份数,按照某个方向进行拆分,axis的取值同上 result = np.split(c, 2, axis=0) print(result) """ [[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]] [array([[1, 2, 3], [4, 5, 6]]), array([[ 7, 8, 9], [10, 11, 12]])] """
shape - 维度
dtype - 元素类型
size - 元素数量
ndim - 维数,
itemsize - 元素字节数
nbytes - 总字节数 = size x itemsize
real - 复数数组的实部数组
imag - 复数数组的虚部数组
T - 数组对象的转置视图
flat - 扁平迭代器
import numpy as np a = np.array([[1 + 1j, 2 + 4j, 3 + 7j], [4 + 2j, 5 + 5j, 6 + 8j], [7 + 3j, 8 + 6j, 9 + 9j]]) print(a.shape) print(a.dtype) print(a.ndim) print(a.size) print(a.itemsize) print(a.nbytes) print(a.real, a.imag, sep='\n') print(a.T) print([elem for elem in a.flat]) b = a.tolist() print(b) """ (3, 3) complex128 2 9 16 144 [[1. 2. 3.] [4. 5. 6.] [7. 8. 9.]] [[1. 4. 7.] [2. 5. 8.] [3. 6. 9.]] [[1.+1.j 4.+2.j 7.+3.j] [2.+4.j 5.+5.j 8.+6.j] [3.+7.j 6.+8.j 9.+9.j]] [(1+1j), (2+4j), (3+7j), (4+2j), (5+5j), (6+8j), (7+3j), (8+6j), (9+9j)] [[(1+1j), (2+4j), (3+7j)], [(4+2j), (5+5j), (6+8j)], [(7+3j), (8+6j), (9+9j)]] """
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。