文章目录
创建数组
np1 = np.array([[1,2,3],[34,44,54]],dtype=np.float) # dtype参数用于指定数据类型
np2 = np.array(np.random.randint(12,size=(3,4)),dtype=np.str)
np3 = np.array(np.arange(10)).reshape(2,5) # 重新设置矩阵大小
np4 = np.empty([3,2]) # 创建空数组
np5 = np.zeros([3,4]) # 常见全部为0的数组
np6 = np.ones([3,4]) # 常见全部为1的数组
从现有数据中创建数组
语法: numpy.asarray(a, dtype = None, order = None)
a: 任意形式的输入参数,比如列表、列表的元组、元组、元组的元组、元组的列表
dtype: 数据类型
x = [3,4,5]
y = [11,21,31]
np.asarray([x,y])
# [[ 3 4 5]
# [11 21 31]]
从可迭代对象构建一个ndarray对象
语法: numpy.fromiter(iterable, dtype, count = -1)
count表示读取的数量, -1代表全部
def iter(x):
for i in range(x):
yield i
x = iter(6)
print(x) # <generator object iter at 0x00000255CF2FE4F8>
q = np.fromiter(x,dtype=int)
print(q) # [0 1 2 3 4 5]
创建给定范围的数组
语法: numpy.arange(start, stop, step, dtype) 类似python的range
np4 = np.arange(10,20,2,dtype=float)
print(np4)
[10. 12. 14. 16. 18.]
创建等差数列
语法: numpy.linspace(start, stop, num, endpoint, retstep, dtype)
num:代表生成等差样例的个数
endpoint: 代表是否包含最后一个值
retstep: 是否返回等差数值
np5 = np.linspace(10,20,5,endpoint=False,retstep=True)
print(np5) (array([10., 12., 14., 16., 18.]), 2.0)
常用方法
数组大小,调整数组大小
- reshape(返回一个新数组,不改变原始数组)
- resize(无返回值,直接改变原始数组)
# ndarry.shape # 返回该数组维度的元组,也可以重置数组大小
print(np1.shape) # (2, 3)
print(np2.shape) # (3, 4)
print(np3.shape) # (2, 5)
np1.shape=(3,2)
print(np1.shape) # (3, 2)
#####################################
# 使用reshape函数来调整数组大小
# 若参数为(-1,1)代表生成x行,1列的数组 -> 把一维变二维
np2 = np2.reshape(6,2)
print(np2.shape) # (6, 2)
得到数组维度
print(np3.ndim) # 2
np2 = np2.reshape(2,3,2)
print(np2.ndim) # 3
转秩
语法: numpy.T
print(np1)
print(np1.T)
'''
[[ 1. 2. 3.]
[34. 44. 54.]]
[[ 1. 34.]
[ 2. 44.]
[ 3. 54.]]
'''
数组的拼接
语法: numpy.concatenate(arrays, axis=None, out=None)
axis =0 :按行进行拼接, 上下 列数必须一样
axis =1 :按列进行拼接, 左右 行数必须一样
q1 = np.arange(12).reshape(4,3)
q2 = np.arange(12).reshape(4,3)
print(q1)
print(q2)
pj1 = np.concatenate([q1,q2],axis=0)
pj2 = np.concatenate([q1,q2],axis=1)
print(pj1)
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]
[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
print(pj2)
[[ 0 1 2 0 1 2]
[ 3 4 5 3 4 5]
[ 6 7 8 6 7 8]
[ 9 10 11 9 10 11]]
数组的拆分
语法: numpy.split(ary, indices_or_sections, axis=0)
axis = 0: 拆分行
axis = 1: 拆分列
q3 = np.arange(16).reshape(4,4)
# 平均分, 第二个参数表示分成几份
print(np.split(q3,2,axis=1))
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
print(np.split(q3,2,axis=0))
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
# 在某个索引处拆分
print(np.split(q3,[3],axis=1)) # 在列索引为3处拆分
[array([[ 0, 1, 2],
[ 4, 5, 6],
[ 8, 9, 10],
[12, 13, 14]]), array([[ 3],
[ 7],
[11],
[15]])]
print(np.split(q3,[3],axis=0)) # 在行索引为3处拆分
[array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]), array([[12, 13, 14, 15]])]
# 把数组拆分成多段
print(np.split(q3,[1,3],axis=1)) # 在列索引分别为1和3处进行拆分
[array([[ 0],
[ 4],
[ 8],
[12]]), array([[ 1, 2],
[ 5, 6],
[ 9, 10],
[13, 14]]), array([[ 3],
[ 7],
[11],
[15]])]
print(np.split(q3,[1,3],axis=0)) # 在行索引分别为1和3处进行拆分
[array([[0, 1, 2, 3]]), array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]), array([[12, 13, 14, 15]])]
数组的排序
语法: numpy.sort(a, axis=-1, kind=None, order=None)
默认按行, axis=0 按列
ar3 = np.array(np.random.randint(10,size=(3,4)))
print(ar3)
row = np.sort(ar3,axis=0)
line= np.sort(ar3,axis=1)
统计数组内的值
a1 = np.arange(48).reshape(6,8)
print("小于20的共有{}个".format(np.count_nonzero(a1<20)))
print("大于20的共有{}个".format(np.sum(a1>20)))
a2 = np.array([-2,-1,27,3,4,67,9,36,6]).reshape(3,3)
print("a2中所有的数都大于0吗:",np.all(a2>0))
print("a2中包含大于0的数吗:",np.any(a2>0))
a1 = np.random.randint(12,size=(4,3))
print(a1)
print(a1.sum(axis=0))
print(a1.sum(axis=1))
判断,并且替换
语法: numpy.where(condition, x=None, y=None)
condition: 判断的条件
x: 满足条件的结果
y: 不满足条件的结果
whe = np.random.randint(10,size=(3,4))
print(whe)
where = np.where(whe>3,whe,-1)
print(where)
索引和切片
# 一维数组
n7 = np.arange(1,10)
print(n7)
print(n7[2:8:2])
print(n7[5])
# 二维数组
n7 = np.arange(1,21).reshape(4,5)
print(n7)
print(n7[1:3,1:3]) # 索引为1到3和行,再找索引为1到3的列的所有数字 等价于n7[1:3][1:3]
# 高级索引
print(n7[[1,2,3],[1,2,3]])# 索引为(1,1),(2,2),(3,3)的数值
print(n7[1:4,1:4]) # 索引为1:4的行和1:4的列
# 布尔值索引
print(n7[n7>15])
n8 = a = np.array([np.nan,1,2,np.nan,3,4,5])
print(n8[~np.isnan(n8)]) # 找出非空值
# 找出
将多维数组展开为一维数组
数组(ndarray)对象提供了ravel方法,用来将多维数组展开为一维数组。
import numpy as np
# 创建er维数组
x3 = np.arange(12).reshape(3,4)
# 对该三维数组进行索引
x3.ravel()
'''
输出:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
'''
数组的广播
两个数组相运算时, 由于维度不同, 会自动进行填充再运算
a = np.array([[0.0,0.0,0.0],[10.0,10.0,10.0],[20.0,20.0,20.0],[30.0,30.0,30.0]])
b = np.array([1.0,2.0,3.0])
print(a*b)
'''
[[ 0. 0. 0.]
[10. 20. 30.]
[20. 40. 60.]
[30. 60. 90.]]
'''
计算
import numpy as np
x1 = np.array([[0,1],[2,3]])
y1 = np.array(np.arange(4,8)).reshape(2,2)
print(x1)
[[0 1]
[2 3]]
print(y1)
[[4 5]
[6 7]]
# 简单的相乘
print(x1*y1)
[[ 0 5]
[12 21]]
# 矩阵运算
print(np.dot(x1,y1))
print(x1.dot(y1))
[[ 6 7]
[26 31]]
x = np.array(np.random.randint(50,size=(2,3)))
print(x)
[[48 13 3]
[39 10 20]]
# 求每一行的最小值
print(np.min(x,axis=1))
[ 3 10]
# 求每一列的和
print(np.sum(x,axis=0))
[87 23 23]
# 求最大小小值的索引位置
print(np.argmin(x))
# 小于某个值的数变为某个值, 大于的也是
# 把x中小于10的都变为10, 大于15的都变为15
print(np.clip(x,10,15))