nan = NaN = NAN
两个numpy.nan
是不相等的。
import numpy as np
print(np.nan == np.nan) # False
print(np.nan != np.nan) # True
numpy.isnan(x, *args, **kwargs)
Test element-wise for NaN and return result as a boolean array.
x = np.array([1, 2, 3, np.nan, 4])
y = np.isnan(x) # [False False False True False]
z = np.count_nonzero(y) # 1
Inf = inf = infty = Infinity = PINF
import numpy as np
print(np.pi) # 3.141592653589793
import numpy as np
print(np.e) # 2.718281828459045
Python原生数据类型:bool、int、float、str,相对较少,对于科学计算,通常需要更多的控制。
常用numpy基本类型:
类型 | 备注 | 说明 |
---|---|---|
bool_ = bool8 | 8位 | 布尔类型 |
int8 = byte | 8位 | 整型 |
int16 = short | 16位 | 整型 |
int32 = intc | 32位 | 整型 |
int_ = int64 = long = int0 = intp | 64位 | 整型 |
uint8 = ubyte | 8位 | 无符号整型 |
uint16 = ushort | 16位 | 无符号整型 |
uint32 = uintc | 32位 | 无符号整型 |
uint64 = uintp = uint0 = uint | 64位 | 无符号整型 |
float16 = half | 16位 | 浮点型 |
float32 = single | 32位 | 浮点型 |
float_ = float64 = double | 64位 | 浮点型 |
str_ = unicode_ = str0 = unicode | Unicode 字符串 | |
datetime64 | 日期时间类型 | |
timedelta64 | 表示两个时间之间的间隔 |
numpy的数据类型实际上是dtype对象的实例。
class dtype(object):
def __init__(self, object, align=False, copy=False):
pass
每个内建类型都有唯一的字符代码。
字符 | 对应类型 | 备注 |
---|---|---|
b | boolean | ‘b1’ |
i | signed integer | ‘i1’, ‘i2’, ‘i4’, ‘i8’ |
u | unsigned integer | ‘u1’, ‘u2’ ,‘u4’ ,‘u8’ |
f | floating-point | ‘f2’, ‘f4’, ‘f8’ |
c | complex floating-point | |
m | timedelta64 | 表示两个时间之间的间隔 |
M | datetime64 | 日期时间类型 |
O | object | |
S | (byte-)string | S3表示长度为3的字符串 |
U | Unicode | Unicode 字符串 |
V | void |
import numpy as np
a = np.dtype('b1')
print(a.type) #
print(a.itemsize) # 1 字长
Machine limits for integer types.
class iinfo(object):
def __init__(self, int_type):
pass
def min(self):
pass
def max(self):
pass
import numpy as np
ii16 = np.iinfo(np.int16)
print(ii16.min) # -32768
print(ii16.max) # 32767
Machine limits for floating point types.
class finfo(object):
def _init(self, dtype):
import numpy as np
ff16 = np.finfo(np.float16)
print(ff16.bits) # 16
print(ff16.min) # -65500.0
print(ff16.max) # 65500.0
print(ff16.eps) # 0.000977
由于datetime被python中日期时间库占用,在numpy中可以用datetime64将字符串转换成日期时间类型。
日期单位 | 代码含义 | 时间单位 | 代码含义 |
---|---|---|---|
Y | 年 | h | 小时 |
M | 月 | m | 分钟 |
W | 周 | s | 秒 |
D | 天 | ms | 毫秒 |
- | - | us | 微秒 |
- | - | ns | 纳秒 |
- | - | ps | 皮秒 |
- | - | fs | 飞秒 |
- | - | as | 阿托秒 |
从字符串创建datetime64类型时,默认情况下,numpy会自动选择单位。
时间日期标准格式:YYYY-MM-YY HH:MM:SS
import numpy as np
a = np.datetime64('2020-10-10')
print(a, a.dtype) # 2020-10-10 datetime64[D]
a = np.datetime64('2020-10-10 20')
print(a, a.dtype) # 2020-10-10T20 datetime64[h]
当然,也可以指定强制指定使用的单位。
import numpy as np
a = np.datetime64('2020-03', 'D')
print(a, a.dtype) # 2020-03-01 datetime64[D]
a = np.datetime64('2020-03', 'Y')
print(a, a.dtype) # 2020 datetime64[Y]
print(np.datetime64('2020-03') == np.datetime64('2020-03-01')) # True
print(np.datetime64('2020-03') == np.datetime64('2020-03-02')) #False
可以从较大的单位转换为较小的单位。
使用arange()
创建 datetime64 数组,用于生成日期范围。
import numpy as np
a = np.arange('2020-08-01', '2020-08-10', dtype=np.datetime64)
print(a)
# ['2020-08-01' '2020-08-02' '2020-08-03' '2020-08-04' '2020-08-05'
# '2020-08-06' '2020-08-07' '2020-08-08' '2020-08-09']
print(a.dtype) # datetime64[D]
a = np.arange('2020-08-01 20:00', '2020-08-10', dtype=np.datetime64)
print(a)
# ['2020-08-01T20:00' '2020-08-01T20:01' '2020-08-01T20:02' ...
# '2020-08-09T23:57' '2020-08-09T23:58' '2020-08-09T23:59']
timedelta64 表示两个 datetime64 之间的差。timedelta64 也是带单位的,并且和相减运算中的两个 datetime64 中的较小的单位保持一致。
numpy 提供的最重要的数据结构是ndarray
,它是 python 中list
的扩展。
import numpy as np #导入numpy
通过array()函数创建
array(p_object, dtype=None, copy=true, order='K', subok=False, ndmin=0)
a=np.array([1,2,3,4])
print(a) # [1 2 3 4]
# 创建二维数组
c = np.array([[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
[26, 27, 28, 29, 30],
[31, 32, 33, 34, 35]])
print(c, type(c))
通过asarray()函数创建
array()
和asarray()
都可以将结构数据转化为 ndarray,但是array()
和asarray()
主要区别就是当数据源是ndarray 时,array()
仍然会 copy 出一个副本,占用新的内存,但不改变 dtype 时asarray()
不会。
def asarray(a, dtype=None, order=None):
return array(a, dtype, copy=False, order=order)
通过fromfunction()函数创建?
fromfunction()从函数中创建数组。
def fromfunction(function, shape, **kwargs)
import numpy as np
def f(x,y):
return 10*x+y
x=np.fromfunction(f,(5,4),dtype=int)
print(x)
零数组
zeros()
函数:返回给定形状和类型的零数组。
zeros_like()
函数:返回与给定数组形状和类型相同的零数组。
def zeros(shape, dtype=None, order='C'):
def zeros_like(a, dtype=None, order='K', subok=True, shape=None):
1数组
ones()
函数:返回给定形状和类型的1数组。
ones_like()
函数:返回与给定形状和类型相同的1数组。
def ones(shape, dtype=None, order='C'):
def ones_like(a, dtype=None, order='K', subok=True, shape=None):
空数组
empty()
函数:返回一个空数组,数组元素为随机数。
empty_like
函数:返回与给定数组具有相同形状和类型的新数组。
def empty(shape, dtype=None, order='C'):
def empty_like(prototype, dtype=None, order='K', subok=True, shape=None):
单位数组
eye()
函数:返回一个对角线上为1,其它地方为零的单位数组。
identity()
函数:返回一个方的单位数组。
def eye(N, M=None, k=0, dtype=float, order='C'):
def identity(n, dtype=None):
对角数组
diag()
函数:提起对角线或构造对角数组。
def diag(v, k=0):
常数数组
full()
函数:返回一个常数数组。
full_like()
函数:返回与给定数组具有相同形状和类型的常数数组。
def full(shape, fill_value, dtype=None, order='C'):
def full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None):
arange()
函数:返回给定间隔内的均匀间隔的值。linspace()
函数:返回指定间隔内的等间隔数字。logspace()
函数:返回数以对数刻度均匀分布。numpy.random.rand()
返回一个由[0,1)内的随机数组成的数组。def arange([start,] stop[, step,], dtype=None):
def linspace(start, stop, num=50, endpoint=True, retstep=False,
dtype=None, axis=0):
def logspace(start, stop, num=50, endpoint=True, base=10.0,
dtype=None, axis=0):
def rand(d0, d1, ..., dn):
结构数组,首先需要定义结构,然后利用np.array()
来创建数组,其参数dtype
为定义的结构。
import numpy as np
personType = np.dtype({
'names': ['name', 'age', 'weight'],
'formats': ['U30', 'i8', 'f8']})
a = np.array([('Liming', 24, 63.9), ('Mike', 15, 67.), ('Jan', 34, 45.8)],
dtype=personType)
print(a, type(a))
# [('Liming', 24, 63.9) ('Mike', 15, 67. ) ('Jan', 34, 45.8)]
#
利用包含多个元组的列表来定义结构**
【例】
import numpy as np
personType = np.dtype([('name', 'U30'), ('age', 'i8'), ('weight', 'f8')])
a = np.array([('Liming', 24, 63.9), ('Mike', 15, 67.), ('Jan', 34, 45.8)],
dtype=personType)
print(a, type(a))
# [('Liming', 24, 63.9) ('Mike', 15, 67. ) ('Jan', 34, 45.8)]
#
# 结构数组的取值方式和一般数组差不多,可以通过下标取得元素:
print(a[0])
# ('Liming', 24, 63.9)
print(a[-2:])
# [('Mike', 15, 67. ) ('Jan', 34, 45.8)]
# 我们可以使用字段名作为下标获取对应的值
print(a['name'])
# ['Liming' 'Mike' 'Jan']
print(a['age'])
# [24 15 34]
print(a['weight'])
# [63.9 67. 45.8]
numpy.ndarray.ndim
用于返回数组的维数(轴的个数)也称为秩,一维数组的秩为 1,二维数组的秩为 2,以此类推。numpy.ndarray.shape
表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 ndim
属性(秩)。numpy.ndarray.size
数组中所有元素的总量,相当于数组的shape
中所有元素的乘积,例如矩阵的元素总量为行与列的乘积。numpy.ndarray.dtype
ndarray
对象的元素类型。numpy.ndarray.itemsize
以字节的形式返回数组中每一个元素的大小。在ndarray
中所有元素必须是同一类型,否则会自动向下转换,int->float->str
。