文章目录
1.1 多维数组对象
1.1.1 创建ndarray
import numpy as np
data = [[1, 2, 3, 4], [5, 6, 7, 8]]
arr = np.array(data)
print(arr)
([[1, 2, 3, 4],
[5, 6, 7, 8]])
函数 | 参数 | 说明 |
---|---|---|
array | array(data) | 将输入数据(列表、元组、数组或其它序列类型)转换成ndarray |
arange | arange(n) | 将输入转换成ndarray(0 ~ n-1) |
ones | ones(shape, dtype) | 创建一个指定的shape和dtype的全1数组 |
ones_like | ones_like(a, dtype) | 创建一个以a数组的shape和dtype的全1数组 |
zeros | zeros(shape, dtype) | 创建一个指定的shape和dtype的全0数组 |
zeros_like | zeros_like(a, dtype) | 创建一个以a数组的shape和dtype的全0数组 |
empty | 创建新数组,只分配内存空间但不填充任何值 | |
empty_like | 创建新数组,只分配内存空间但不填充任何值 | |
eye、identity | eye(n, k, dtype) | 创建一个n*n的单位矩阵(对角线为1,其余为0,k为对角线起始索引) |
1.1.2 ndarray的数据类型
类型有:
- int8、int16、int32、float16、float32、float64、float128、complex64、complex128、complex256
- bool、object(Python对象类型)、string_、unicode_
可以通过astype方法显式地转换其dtype
arr = np.array([1, 2, 3, 4, 5])
arr2 = arr.astype(np.float64)
arr2.dtype
1.1.3 数组和标量之间的运算
arr = np.array([1, 2, 3, 4, 5])
arr + 1 # array([2, 3, 4, 5, 6])
arr = np.array([1, 2, 3, 4, 5])
arr * 2 # array([ 2, 4, 6, 8, 10])
arr = np.array([1, 2, 3, 4, 5])
1/arr # array([1. , 0.5 , 0.33333333, 0.25 , 0.2 ])
1.1.4 基本的索引和切片
1、索引
arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
# ----------------------
arr3d
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
# ----------------------
arr3d[0]
array([[1, 2, 3],
[4, 5, 6]])
# ----------------------
arr3d[0] = 42
arr3d
array([[[42, 42, 42],
[42, 42, 42]],
[[ 7, 8, 9],
[10, 11, 12]]])
2、切片
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# ----------------------
arr2d
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# ----------------------
arr2d[0:2]
array([[1, 2, 3],
[4, 5, 6]])
# ----------------------
arr2d[:2, 1:]
array([[2, 3],
[5, 6]])
1.1.5 数组的转置和轴对换
arr = np.arange(16).reshape((4,4))
# ----------------------
arr
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
# ----------------------
arr.T
array([[ 0, 4, 8, 12],
[ 1, 5, 9, 13],
[ 2, 6, 10, 14],
[ 3, 7, 11, 15]])
# ----------------------
np.dot(arr.T, arr) # 计算arr的转置与arr的内积
array([[224, 248, 272, 296],
[248, 276, 304, 332],
[272, 304, 336, 368],
[296, 332, 368, 404]])
1.2 通用函数:快速的元素级数组函数
1.2.1 一元函数ufunc
函数 | 说明 |
---|---|
abs、fabs | 计算整数、浮点数或复数的绝对值。对于非复数值,可以使用更快的fabs。 |
sqrt | 计算各元素的平方根。 |
square | 计算各元素的平方。 |
exp | 计算各元素的指数 e x \ e^{x} ex |
log、log10、log2、log1p | 分别为自然对数(底数为e)、底数为10的log、底数为2的log、log(1+x) |
sign | 计算各元素的正负号:1(正数)、0(零)、-1(负数) |
cell | 计算各元素的celling值,即大于等于该值的最小整数 |
floor | 计算各元素的floor值,即小于等于该值的最大整数 |
rint | 将各元素值四舍五入到最接近的整数,保留dtype |
modf | 将数组的小数和整数部分以两个独立数组的形式返回 |
isnan | 返回一个表示“哪些值是NaN”的布尔型数组 |
isfinite、isinf | 分别返回一个表示”哪些元素是有穷的(非inf。非NaN)”或“哪些元素是无穷的”的布尔型数组 |
cos、cosh、sin、sinh、tan、tanh | 普通型和双曲型三角函数 |
arccos、arccosh、arcsin、arcsinh、arctan、arctanh | 反三角函数 |
logical_not | 计算各元素not x的真值。相当于-arr |
1.2.2 二元函数ufunc
函数 | 说明 |
---|---|
add | 将数组中对应的元素相加 |
subtract | 从第一个数组中减去第二个数组中的元素 |
multiply | 数组元素相乘 |
divide、floor_divide | 除法或向下圆整除法(丢弃余数) |
power | 第一个数组中的元素为A,第二个数组中对应的元素为B,计算 A B \ A^B AB |
maximum、fmax | 元素级的最大值计算(同列最大值),fmax将忽略NaN |
minimum、fmin | 元素级的最小值计算(同列最小值),fmin将忽略NaN |
copysign | 将第二个数组中的值的符号复制给第一个数组中的值 |
greater、greater_equal、less、less_equal、equal、not_equal | 执行元素的比较运算,最终产生布尔型数组。相当于运算符>、>=、<、<=、==、!= |
logical_and、logical_or、logical_xor | 执行元素级的真值逻辑运算。相当于和、或、异或 |
1.3 利用数组进行数据处理
1.3.1 将条件逻辑表述为数组运算
numpy.where函数是三元表达式x if conditon else y的矢量化版本。
import numpy as np
xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
cond = np.array([True, False, True, True, False])
np.where(cond, xarr, yarr)
# -----------------------------------------------
array([1.1, 2.2, 1.3, 1.4, 2.5])
zarr = np.array([-1, 1, -2, 2, 3])
np.where(zarr > 0, 2, -2)
# --------------------------------
array([-2, 2, -2, 2, 2])
1.3.2 数学和统计方法
基本数组统计方法
方法 | 说明 |
---|---|
sum | 对数组中全部或某轴向的元素求和。零长度的数组的sum为0 |
mean | 算术平均数。零长度的数组的mean为NaN |
std、var | 分别为标准差和方差,自由度可调(默认为n) |
min、max | 最大值和最小值 |
argmin、argmax | 分别为最大和最小值的索引 |
cumsum | 所有元素的累计和 |
cumprod | 所有元素的累计积 |
1.3.3 用于布尔型数组的方法
1、sum经常被用来对布尔型数组中的True值计数
arr = np.random.randn(100)
(arr > 0).sum() # 正数的数量
# ------------------------------
54
2、any用于测试数组中是否存在一个或多个True
bools = np.array([False, False, True, False])
bools.any()
# ----------------------------------------
True
3、all检查数组中所有的值是否都是True
bools.all()
# ----------------
False
1.3.4 排序
1、一维数组排序
arr = np.random.randn(8)
arr
# --------------------------
array([-1.34090737, -1.11147088, 1.14095049, -1.33143649, -1.31622927,
0.63895622, 0.14932652, -0.50808672])
arr.sort()
arr
# ---------------------------
array([-1.34090737, -1.33143649, -1.31622927, -1.11147088, -0.50808672,
0.14932652, 0.63895622, 1.14095049])
2、多维数组排序
arr = np.random.randn(5,3)
arr
# ---------------------------------
array([[ 0.36169348, 1.0702042 , -1.48938408],
[-0.59650124, -0.6072529 , 0.20503847],
[-0.0850005 , 1.40057176, 0.08668278],
[ 1.99371954, -0.80790195, -0.75650762],
[-2.14722736, -2.3670578 , 1.91681634]])
np.sort(arr) # 默认行排列
# ----------------------------------
array([[-1.48938408, 0.36169348, 1.0702042 ],
[-0.6072529 , -0.59650124, 0.20503847],
[-0.0850005 , 0.08668278, 1.40057176],
[-0.80790195, -0.75650762, 1.99371954],
[-2.3670578 , -2.14722736, 1.91681634]])
np.sort(arr,1) # 行排列
# ---------------------------------
array([[-1.48938408, 0.36169348, 1.0702042 ],
[-0.6072529 , -0.59650124, 0.20503847],
[-0.0850005 , 0.08668278, 1.40057176],
[-0.80790195, -0.75650762, 1.99371954],
[-2.3670578 , -2.14722736, 1.91681634]])
np.sort(arr,0) # 列排列
# --------------------------------
array([[-2.14722736, -2.3670578 , -1.48938408],
[-0.59650124, -0.80790195, -0.75650762],
[-0.0850005 , -0.6072529 , 0.08668278],
[ 0.36169348, 1.0702042 , 0.20503847],
[ 1.99371954, 1.40057176, 1.91681634]])
1.3.5 唯一化以及其它元素的集合逻辑
函数np.unique用于找出数组中的唯一值并返回已排序的结果。
ints = np.array([3, 3, 3, 2, 2, 0,0, 1])
np.unique(ints)
# ----------------------------------------
array([0, 1, 2, 3])
函数np.in1d用于测试一个数组中的值在另一个数组中的成员资格,返回一个布尔型数组。
values = np.array([6, 0, 0, 3, 2, 5, 6])
np.in1d(values, [2, 3, 6])
# ---------------------------------------
array([ True, False, False, True, True, False, True])
数组的集合运算
方法 | 说明 |
---|---|
unique(x) | 计算x中的唯一元素,并返回一个有序结果 |
intersect1d(x,y) | 计算x和y中的公共元素,并返回有序结果 |
union1d(x,y) | 计算x和y的并集,并返回有序结果 |
in1d(x,y) | 得到一个表示“x的元素是否包含于y”的布尔型数组 |
setdiff1d(x,y) | 集合的差,即元素在x中且不在y中 |
setxor1d(x,y) | 集合的对称差,即存在于一个数组中但不同时存在于两个数组中的元素 |