Numpy基本用法
NumPy ndarray 对象
- numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
- 参数说明
名称 描述P
object 数组或嵌套的数列
dtype 数组元素的数据类型,可选
copy 对象是否需要复制,可选
order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
subok 默认返回一个与基类类型一致的数组
ndmin 指定生成数组的最小维度
- 实例
import numpy as np
arr = np.array([[1,2,3],[4,5,6],[7,8,9]],namin=3,dtype=complex)
print(arr)
NumPy数据类型
- 常用数据类型
名称 描述
bool_ 布尔型数据类型(True 或者 False)
int_ 默认的整数类型(类似于 C 语言中的 long,int32 或 int64)
intc 与 C 的 int 类型一样,一般是 int32 或 int 64
intp 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64)
int8 字节(-128 to 127)
int16 整数(-32768 to 32767)
int32 整数(-2147483648 to 2147483647)
int64 整数(-9223372036854775808 to 9223372036854775807)
uint8 无符号整数(0 to 255)
uint16 无符号整数(0 to 65535)
uint32 无符号整数(0 to 4294967295)
uint64 无符号整数(0 to 18446744073709551615)
float_ float64 类型的简写
float16 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位
float32 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位
float64 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位
complex_ complex128 类型的简写,即 128 位复数
complex64 复数,表示双 32 位浮点数(实数部分和虚数部分)
complex128 复数,表示双 64 位浮点数(实数部分和虚数部分)
- 数据类型对象
numpy.dtype(object, align, copy)
- 参数说明
object 要转换为的数据类型对象
align 如果为 true,填充字段使其类似 C 的结构体。
copy 复制 dtype 对象 ,如果为 false,则是对内置数据类型对象的引用
- ex:
import numpy as np
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student)
print(a)
NumPy 数组属性
- NumPy的数组中比较重要的对象属性
ndarray.ndim 秩,即轴的数量或维度的数量
ndarray.shape 数组的维度,对于矩阵,n 行 m 列
ndarray.size 数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtype ndarray 对象的元素类型
ndarray.itemsize ndarray 对象中每个元素的大小,以字节为单位
ndarray.flags ndarray 对象的内存信息
ndarray.real ndarray元素的实部
ndarray.imag ndarray 元素的虚部
ndarray.data 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。
NumPy 数组属性的使用
ndarray.ndim 用于返回数组的维数,等于秩.
- ex1 (ndarray.ndmin)
import numpy as np
arr_0 = np.arange(24)
print(arr.ndmin) # arr现在只有一个维度
arr_1 = arr_0.reshape(2,4,3)
print(att_1)
print(arr_1.ndmin)
ndarray.shape 表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 ndim 属性(秩).比如,一个二维数组,其维度表示"行数"和"列数".
- ndarray.shape 也可以用于调整数组大小.
- ex2 (ndarray.shape)
import numpy as np
arr = np.array([[1,2,3],[4,5,6]])
print(arr.shape)
- out:(2, 3)
numpy.itemsize
- ndarray.itemsize 以字节的形式返回数组中每一个元素的大小.
- ex3
import numpy as np
# 数组的 dtype 为 int8(一个字节)
x = np.array([1,2,3,4,5], dtype = np.int8)
print (x.itemsize)
# 数组的 dtype 现在为 float64(八个字节)
y = np.array([1,2,3,4,5], dtype = np.float64)
print (y.itemsize)
out: 1
8
ndarray.flags
- ndarray.flags 返回 ndarray 对象的内存信息,包含以下属性
C_CONTIGUOUS (C) 数据是在一个单一的C风格的连续段中
F_CONTIGUOUS (F) 数据是在一个单一的Fortran风格的连续段中
OWNDATA (O) 数组拥有它所使用的内存或从另一个对象中借用它
WRITEABLE (W) 数据区域可以被写入,将该值设置为 False,则数据为只读
ALIGNED (A) 数据和所有元素都适当地对齐到硬件上
UPDATEIFCOPY (U) 这个数组是其它数组的一个副本,当这个数组被释放时,原数组的内容将被更新
-ex4
import numpy as np
arr = np.array([1,2,3,4,5])
print(arr.flags)
-out: C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
NumPy 数组的简单操作
创建数组的几种特殊方式
- arr = np.empty([3,2],dtype=int64, order='C')
- arr = np.zeros([2,2],dtype=int)
- arr = np.ones([2,2],dtype=int)
- arr = np.eye(3)
- arr = np.full([2,2],8) 生成两行两列元素全为8的数组
numpy.random
- numpy.random.random(2,3)
- numpy.random.randint(1,10,size=(2,3))
numpy.empty
numpy.empty(shape, dtype, order)
- 参数说明
shape 数组形状
dtype 数据类型,可选
order 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。
ex:
import numpy as np
arr = numpy.empty([3,2], dtype=int64, order='C')
print(arr)
numpy.zeros
ex:
import numpy as np
# 默认为浮点数
x = np.zeros(5)
print(x)
# 设置类型为整数
y = np.zeros((5,), dtype = np.int)
print(y)
# 自定义类型
z = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])
print(z)
numpy.ones(同上)
import numpy as np
arr = np.ones([2,2],dtype=int)
print(arr)
数组索引与切片
一维数组
import numpy as np
a = np.arange(1,10)
print(a)
# 索引操作
print(a[4])
# 切片
print(a[4,6])
# 步长
print(a[::2])
# 复数索引
print(a[-1])
多维数组
通过中括号来索引和切片,中括号内部如果有两个值,并且用逗号隔开,则代表几行几列,即索引某一元素所在的相对位置
如果多维数组中只有一个值,则代表行
import numpy as np
a = np.random.randint(1, 10, size=(3, 4))
print(a)
# 一行三列的数据
print(a[1, 3])
# 第二行与第三行数据
print(a[[1, 2]])
print()
# 第零行数据
print(a[0])
# 获取数据不连续时,代表分别获取第零行第二列,和第一行第三列的数据
print(a[[0,1],[2,3]])
print()
# 表示获取第零行和第一行的第一列和第二列数据
print(a[0:2,1:3])
# 获取某一列的数据,表示获取第一列的数据
print(a[:,1])
# 布尔索引 | & ! < = > 等等
print(a[(a>3) & (a<7)])
数组元素的替换,有索引替换,条件替换和where替换
import numpy as np
a = np.random.randint(1, 10, size=(3, 4))
print(a)
# 第零行元素替换为[1,2,3,4]
a[0] = np.array([1, 2, 3, 4])
print(a)
# a数组中小于五的元素替换为零
a[a < 5] = 0
print(a)
# a数组中小于五的元素替换为零,其余替换为1
b = np.where(a < 5, 0, 1)
print(b)
数组的运算
1.数组和数组运算,若其形状相同,则可进行加减乘除运算
2.若其形状不同且行数和列数不等于1 不能进行运算
3.若其中一方的行数或列数相等,且有一方的另外的行或者列等于1,则可以进行运算
4.若双方的行或者列均为1, 则可以进行运算
reshape 和 resize ,flatten 和 ravel 方法
flatten and ravel
comment:
不会改变数值,知识将数组换成一维
different:
flatten不会与数组产生依赖关系
ravel则会想指针一样与数组产生依赖关系,可以对一维数组改变
reshape and resize
comment:
都会改变数组的值
different:
reshape形成了新的数组
resize则是在原来数组的基础上直接改动,替换了原来的数组
不同数组的组合
叠加方式
####1.vstack:垂直叠加,列相同
a = np.random.randint(1, 10, size=(2, 4))
b = np.random.randint(1,10, size=(3,4))
c = np.vstack([a, b])
print©
####2.hstack:水平叠加,行相同
a = np.random.randint(1, 10, size=(2, 4))
b = np.random.randint(1,10, size=(3,4))
c = np.hstack([a, b])
print©
####3.concatenate(arr1,arr2,axis):当axis=0时,垂直叠加; 当axis=1时,水平叠加
a = np.random.randint(1, 10, size=(2, 4))
b = np.random.randint(1,10, size=(3,4))
c = np.concatenate(a, b,axis=0)
print©
切割方式
####1.vsplit:垂直切割
a = np.random.randint(1,10,size=(4,6))
b = np.vsplit(a,2)
c = np.vsplit(a,(0,2))
####2.hspilt:水平切割
a = np.random.randint(1,10,size=(4,6))
b = np.hsplit(a,2)
c = np.hsplit(a,(0,2))
####3. np.split(arr,indicate_or_seciont,axis) axis=0,垂直切割; axis=1,水平切割
# arr数组在水平方向平均分成三份
a = np.random.randint(arr,3,axis=1)
读取和存入csv文件
np.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ', encoding=None)
参数说明
fname:文件名
X:要保存的数组
fmt:数据格式
delimiter:分隔符,默认是空格,可以使用都好作为分隔符
newline:分割行的字符串或字符
header:文件第一行内容
footer:写入文件末尾的字符串
comments: 默认作为空字符串
encoding:保存格式
一般需要的几个参数:fname,X,fmt,delimiter,header,comments
np.loadtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None,
unpack=False, ndmin=0, encoding='bytes', max_rows=None, *, like=None)
常用参数说明
fname:文件名
dtype:文件类型,int,float,double等
comments:一般使用空字符串
delimiter:分隔符
skipnows:省略第几行
unpack:默认false, 如果为True,则是数组的转置
np.savetxt and np.loadtxt 都只能加载或保存一维或二维数组,不能保存三维及其以上数组
np.save(file, arr, allow_pickle=True, fix_imports=True)
参数说明
file:文件名,保存的是npy文件,保存时不用加npy
arr:数组
load(file, mmap_mode=None, allow_pickle=False, fix_imports=True, encoding='ASCII')
参数说明
file:文件名,需要加后缀 其余参数一般不变
普通读取csv的方式
with open(fname,'r') as fp:
reader = csv.reader(fp)
# 不读取第一行内容
next(reader)
for x in reader:
print(x)
# 只用DictReader方法读取,是字典形式
with open(fname,'r') as fp:
# reader迭代器,使用DictReader时不包含第一行,直接以字典形式输出
reader = csv.DictReader(fp)
for x in reader:
print(x)