Numpy基础使用
本章及后面更新的Numpy博客,我都使用标准的Numpy导入方式import numpy as np
。
当然你也可以在代码中写from numpy import *
来省略多写的一个np。但是我还是建议你用标准导入方式,因为numpy这个命名空间包含了大量与Python内建函数重名的函数(就像 min
和 max
)
Numpy ndarray: 多维数组对象
生成随机数组
# 生成随机数组
data=np.random.randn(2,3)
print(data,"\n")
# 给data一个数学操作
print(data*10,"\n")# 将里面数值扩大10倍
print(data+data,"\n")#相加了
# 一个ndarray是一个通用的多维同类数据容器,每个数组有一个shape属性,用来表证数组每一维度的数量,每个数组都有一个dtype属性
print(data.shape)#(2, 3)
print(data.dtype)#float64
生成ndarray
# 生成ndarray
data1=[6,5,8,4,5,6,1]
arr1=np.array(data1)
print(arr1)
# 嵌套序列
data2=[[1,2,3,4],[5,6,7,8]]
arr2=np.array(data2)
print(arr2)
# 因为data2是一个包括列表的列表,所以numpy数组arr2形成了二维数组,可以通过ndim和shape属性来确定
print(arr2.ndim)
# out
'''
2
(2, 4)
'''
print(arr2.shape)
数组生成
# 除了np.array还有很多其他函数可以创建新数组
New_Numpy_List=np.zeros(10)
print(New_Numpy_List)
# [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
print(np.zeros((3,6)))
# [[0. 0. 0. 0. 0. 0.]
# [0. 0. 0. 0. 0. 0.]
# [0. 0. 0. 0. 0. 0.]]
# 使用empty来生成一个全0的数组不安全,他可能会生成一堆垃圾数据
print(np.empty((2,3,2)))
# arange
print(np.arange(15))
# [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
# eye,identity可以生成N*N的矩阵 对角线是1
print(np.eye(4,4))
print(np.identity(4))
Numpy数据类型
类型 | 类型代码 | 描述 |
---|---|---|
int8,uint8 | il,ul | 有符号和无符号的8数位整数 |
int41,unint16 | i2,u2 | 有符号和无符号的32数位整数 |
int32,unint32 | i4,u4 | 有符号和无符号的32数位整数 |
int64,unint64 | i8,u8 | 有符号和无符号的64数位整数 |
float16 | f2 | 半精度浮点数 |
float32 | f4或f | 标准单精度浮点数;兼容C语言float |
float64 | f8或d | 标准双精度浮点数;兼容C语言double和 python float |
float128 | f16或g | 拓展精度浮点数 |
complex64 | c8,c16,c32 | 分别基于32位、64位、128位浮点数的复数 |
complex128 | ||
complex256 | ||
bool | ? | 布尔值,存储True或False |
object | o | Python object类型 |
string_ | S | 修正的ASCLL字符串类型;例如生成一个长度 为10的字符串类型,使用‘S10’ |
unicode_ | U | 修正的Unicode类型;生成一个长度 为10的Unicode类型,使用‘U10’ |
数组类型转换
显式转换
arr5=np.array([1,2,3,4,5])
print(arr5.dtype)
# int32
float_arr=arr5.astype(np.float64)
print(float_arr.dtype)
# float64
在上面例子中,整数被转换成了浮点数。如果我把浮点数转换为整数,则小数点后的部分都将被消除:
arr=np.array([3.7,-1.2,-2.6,0.5,12.9,10.1])
print(arr)
arr.astype(np,int32)
print(arr)
如果你有一个数组,里面的元素都是表达数字含义的字符串,也可以通过astype
将字符串转换为数字:
numeric_strings=np.array(['1.25','9.6','42'],dtype=np.sting_)
print(numeric_strings.astype(float))
在Numpy中,当使用numpy.string_
类型作字符串数据时要小心,因为Numpy会修正它的大小或删除输入且不发出警告。pandas在处理非数值数据时有更直观的开箱型操作。
如果因为某些原因导致转换类型是失败(比如字符串无法转换为float64
位时),将会抛出一个ValueError
。这里我偷懒地使用float
来代替np.float64
,是因为Numpy可以使用相同别名来表征与python精度相同的Python数据类型。
你也可以使用另一个数组的dtype
属性:
int_array=np.arange(10)
calibers=np.array([.22,.270,.357,.380,.44,.50],dtype=np.float64)
print(int_array.astype(calibers.dtype))
也可以使用类型代码来传入数据类型:
empty_uint32=np.empty(8,dtype='u4')
print(empty_uint32)
#[ 0 1072693248 0 1072693248 0 1072693248
# 0 1072693248]
Numpy 数组算术
数组之所以重要是因为它允许你进行批量操作而无须任何for
循环。numpy用户称这种特性为向量化。任何在两个等尺寸数组之间的算术操作都应用了逐元素操作的方式:
arr=np.array([[1.,2.,3.],[4.,5.,6.]])
print(arr)
[[1. 2. 3.],
[4. 5. 6.]]
print(arr*arr)
[[ 1. 4. 9.],
[16. 25. 36.]]
print(arr-arr)
[[0. 0. 0.],
[0. 0. 0.]]
带有标量计算的算术操作,会把计算参数传递给数组的每一个元素:
print(1/arr)
print(arr**0.5)
同尺寸数组之间比较,会产生一个布尔值数组:
arr2=np.array([[0.,4.,1.],[7.,2.,12.]])
print(arr2)
print(arr2>arr)
#out
[[False True False]
[ True False True]]