Numpy基础
Numpy的核心:ndarray对象(数组)
使用numpy.ndarray对象表示一个数组:
import numpy as np
ary = np.array([1, 2, 3, 4])
print(ary)
ary = ary * 10
print(ary)
内存中的ndarray对象
元数据(metadata)
储存对目标数组的描述信息,如dim count(维数),dimersions(维度,元组形式), dtype(数组元素的类型),date等
实际数据
完整的数组数据。(Ndarray数组是同质数组,所有元素类型相同)
将实际数据与元数据分开存放,一方面提高内存空间的使用效率,另一方面减少了对实际数据的访问频率,提高性能。
ndarray数组对象的创建
np.array(可以被解释为Numpy数组的序列)
np.arange(起始值【0】,终止值,步长【1】)
np.zeros(数组元素的个数,dtype=“数组元素类型”)
np.ones(数组元素的个数,dtype=“数组元素类型”)
ndarray对象属性的基本操作
数组的维度:array.shape
元素的类型: array.dtype
数组元素的个数: array.size
数组的索引(下标):array[0]
shape[0]页 shape[1]行 shape[2]列 三维理解,页,行,列
代码位置: D:\1902liuxuan\data_science\day01\demo04.py
ndarray属性操作详解
Numpy内置的基本数据类型
类型名 类型表示符 布尔型 bool_ 有符号整型 int8(-128~127)/int16/int/32/int64 无符号整型 uint8(0~255)/uint16/uint32/uint64 浮点型 float16/float32/float64 复数型 complex64/complex128 字符串型 str_ (每个字符用32位的Unicode编码表示)
numpy自定义复合类型
五种方法
D:\1902liuxuan\data_science\day01\demo05.py
案例,在ndrray数组中存储3位学生的信息。
import numpy as np data = [("zs", [10, 15, 2], 3), ("ls", [18, 16, 52], 9), ("ww", [85, 55, 7], 14)] # 第一种设置dtype的方式 a = np.array(data, dtype="U2, 3int32, int32") # U2 2个Unicode字符,一个字符是32位 3int32 表示32位整数出现3次(列表) print(a, "zs.age:", a[0]["f2"]) # f2表示filed2,第3个字段 # 第二种设置dtype的方式 b = np.array(data, dtype=[ ("name", "str_", 2), ("scroe", "int32", 3), ("age", "int32", 1)]) print(b, ";zs.age", b[0]["age"]) # 第三种设置dtype的方式 c = np.array(data, dtype={ "names": ["name", "score", "age"], "formats": ["U2", "3int32", "int32"]}) print(c, ";ls.name:", c[1]["name"]) # 第四种设置dtype的方式 # 例如scores字段在存储时将会从第16个字节开始输出分数列表 # 数据,3int32将会占用12字节,那么age字段将会从28个字节开始 # 向后输出。 # U2占用了8个字节,虽然浪费了空间,但是这种数据存储对齐的做法 # 在数据访问时将提高了效率 d = np.array(data, dtype={ "name": ("U2", 0), "scores": ("3int32", 16), "age": ("int32", 28)}) # 第五种设置dtype的方式 e = np.array([0x1234, 0x5678], dtype=("u2", {"lowc": ("u1", 0), "highc": ("u1", 1) })) print("%x" % e[0]) print("%x" % e["lowc"][0]) print("%x" % e["highc"][0])ndarray对象处理日期类型元素
astype()
from __future__ import unicode_literals import numpy as np f = np.array(["2018", "2019-01-01", "2019-02-01", "2019-01-02 01:01:01"]) f.astype("M8[D]") # print(f) g = f.astype("M8[M]") # M8 日期格式 # D day M month s second print(g, ";g.dtype:", g.dtype) h = g.astype("int32") print(h) print(h[2] - h[1])D:\1902liuxuan\data_science\day01\demo06.py
类型的简写字符码
类型 字符码 bool_ ? int8/int16/int32/int64 i1/i2/i4/i8 uint8/uint16/uint32/uint64 u1/u2/u4/u8 float16/float32/float64 f2/f4/f8 complex64/complex128 c8/c16 str_ U<字符数> datetime64 M8[Y]/[M]/[D]/[h]/[m]/[s]
ndarray数组对象的维度操作
视图变维:(数据共享)原始数据未变 array.reshape() array.ravel()
import numpy as np a = np.arange(1, 9) # 视图变维使用的还是原始数组中的数据 b = a.reshape((2, 4)) print(a) print(b) a[0] = 999 print(b) b[0][0] = 888 print(b) print(a) c = b.ravel() print(c)复制变维(数据独立):生成新数据 flatten()
d = b.flatten() print(d) d[0] = 777 print(b)就地变维:直接使用shape属性修改数组维度,不返回新数组。a.shape a.resize()
d.shape = (2, 4) print(d) d.resize(2, 2, 2) print(d)ndarray数组的切片操作
多维数组拿逗号拆分
# 数组的切片与列表切片参数类似 array[起始位置:终止位置:步长] a.resize(3, 3, 3) print(a) print(a[0:2, :, 2:3])ndarray数组的掩码操作
any() 两个数组或运算
all() 两个数组与运算
# ndarray 对象的而掩码操作 a = np.array([1, 2, 3, 4, 5, 6, 7, 8]) f = np.array([True, False, True, False, True, False, True, False, ]) print(a[f]) print(a[a > 3]) # 找1-100中3的倍数或7的倍数打印出来 a = np.arange(1, 100) flag_a = a % 3 == 0 flag_b = a % 7 == 0 flag = np.any([flag_a, flag_b], axis=0) flag_all = np.all([flag_a, flag_b], axis=0) print(flag) print(a[flag]) print(a[flag_all])多维数组的组合与拆分
垂直方向的操作:vstack() vsplit()
水平方向操作:hstack() hsplit()
深度方向操作(理解为组合后从上面看):dstack() dsplit()
import numpy as np a = np.arange(1, 7).reshape(2, 3) # [1,2,3,4,5,6] b = np.arange(7, 13).reshape(2, 3) # [7,8,9,10,11,12] # 垂直方向操作 c = np.vstack((a, b)) print(c) a, b = np.vsplit(c, 2) # 2的意思是拆成2份 print(a, "\n", b) # 水平方向操作 d = np.hstack((a, b)) print(d) a, b = np.hsplit(d, 2) print(a, "\n", b) # 深度方向操作 # print("深度操作") e = np.dstack((a, b)) print(e) a, b = np.dsplit(e, 2) print(a, "\n", b)多维数组组合与拆分的相关函数:
根据axis所指向的轴向(0,1,2)进行多维数组的组合
如果待组合的两个数组都是二维数组:axis=0代表垂直方向,axis=1代表水平方向
如果待组合的两个数组都是三维数组:axis=0代表垂直方向,axis=1代表水平方向,axis=3代表深度方向
c = np.concatenate((a,b),axis=0)
np.split(c, 2, axis=0)
通过给定的axis轴向与拆分的份数对c数组进行拆分
a = a.reshape(2, 3) b = b.reshape(2, 3) c = np.concatenate((a, b), axis=1) print(c)长度不等的两个数组的组合操作
np.pad(ary, pad_width=(0, 1), mode=“constant”, constant_values = -1)
np.pad( ary, #原始数组 pad_width=(0, 1), #补全方式(头补0个,尾补1个) mode="constant", #设置补全模式为constant constant_values = -1 #设置补全的默认值为-1 ) a = np.arange(1, 7) b = np.arange(11, 16) c = np.pad(b, pad_width=(0, 1), mode="constant", constant_values=-1) print(a) print(b) print(c) d = np.vstack((a, c)) print(d)中间插入 insert()
末尾追加 append()
简单的一维数组组合方案
np.row_stack((a, b))
np.column_stack((a, b))
a = np.arange(1, 10) b = np.arange(11, 20) # 把a与b摞在一起成为两行 c = np.row_stack((a, b)) # 把a与b并在一起成为两列 d = np.column_stack((a, b)) print(c) print(d)numpy数组的其他属性
shape 维度 dtype 元素类型 size 数组元素的个数 ndim 维数 itemsize 元素字节数 nbytes 数组总字节数 real 复数数组的实部 imag 复数数组的虚部 T 数组对象的转置视图(行列互换效果) flat 返回数组的扁平迭代器