简介
NumPy 数组的维数称为秩(rank),一维数组的秩为 1,二维数组的秩为 2,以此类推。 在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。所以一维数组就是 NumPy 中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。 很多时候可以声明 axis。axis=0,表示沿着第 0 轴进行操作,即对每一列进行操作;axis=1,表示沿着第1轴进行操作,即对每一行进行操作。
属性 | 说明 |
---|---|
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 | 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。 |
linspace 等差
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
# 等差数列
# 样本在1 ~ 50之间
# 10 表示样本的个数
# False 表示是否包含最后一个元素, 即是否包含50这个数
# True 是否显示步长 当显示步长的时候返回的是Tuple
x = np.linspace(1,50,10,False,False).reshape([2,5])
当要显示步长的时候 返回的是一个Tuple 类型。此时不能,使用reshape,来生成矩阵 这是输出
[[ 1. 5.9 10.8 15.7 20.6]
[25.5 30.4 35.3 40.2 45.1]]
logspace 等比
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
比如
# 1.0 开始是从 base = 10 10的1次方
# 4.0 结束是从 base的4次方结束
a = np.logspace(1.0, 4.0, num=10,endpoint=True,base=2)
print(a)
默认 base 是10 ,start 和 end 都是 base的指数, 从base 2的 1次方到4 次方,按照等比的形式,生成num = 10个数
取值
索引
有两个参数 […,a] 表示取 第 a列 [a,…] 表示取 第 a行 [a:,…] 表示取 第 a行之后的所有 包含第a 行 [:a,…] 表示取 第 a行之前的所有 不包含第a 行 [a,b] 表示取第a行b列的指定元素
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(a)
b = a[1:]
print('分割线')
print(b)
print('分割线')
# 第一个参数表示的是行
# 第二个参数表示的列,数字表示第几列
print(a[...,0])
print('分割线')
print(a[..., 1])
print('分割线')
print(a[..., 2])
print('分割线')
print(a[0, ...])
print('分割线')
# 1: 表示第n+1行以及以下的所有
print(a[1:, ...])
print('分割线')
print(a[2, ...])
print('分割线')
# 指定某个具体的元素
print(a[2,1])
高级索引
x = np.array([[1,2],[3,4],[5,6]])
y = x[[0,1,2],[0,1,1]]
x 为一个3*2矩阵
[[0,1,2],[0,1,1]] 可以理解为一个下面的矩阵
对应的点为
(0,0),(1,1),(2,1)
y即为x中对应的点的ndarray,即为
[1,3,5]
再比如
x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
print('我们的数组是:')
print(x)
print('\n')
rows = np.array([[0, 0], [3, 3]])
cols = np.array([[0, 2], [0, 2]])
y = x[rows, cols]
x 为一个 3*3 数组:
row
和 clo
组成了一个矩阵
第一行 row1
的两个点为
[(0,0),(0,2)]
第二行 row2
的两个点为
[(3,0),(3,2)]
对应 3*3矩阵中的元素,即为,四个角标
借住切片 :
或者...
,与索引数组组合
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b = a[1:3, 1:3]
c = a[1:3,[1,2]]
d = a[...,1:]
print(b)
print(c)
print(d)
展示的是一个数组
a[1:3,1:3]
表示截取 矩阵a中,row从1-3,col 也是1-3,左闭右开
a[1:3,1,2]
表示截取 矩阵a中,row从1-3,col 是 1和 2,是一个数组,不是一个区间,
a[...,1:]
表示截取 矩阵a中,row从1-3,col 是 1和 2,是一个数组,不是一个区间,
... 表示所有行,1: 表示从1列到最后
BOOL 索引
我们可以通过一个布尔数组来索引目标数组,布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。
def boolSy():
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print('我们的数组')
print(a)
print(a[a > 5])
// 输出
[6 7 8 9]
返回,满足条件的元素组成的数组
花式索引
x=np.arange(32).reshape((8,4))
print (x[[4,2,1,7]])
这个返回的是,row = ,4,5,1,7 的行
如果print(x[[4, 2, 1, 7],[1,1,1,1]])
返回的是一个一位数组,为两个数组对应的元素
有个精彩的地方
a = x[[4, 2, 1, 7],[1,1,1,1]]
b = x[np.ix_([1,5,7,2],[0,3,1,2])]
这两个看着很一样,但是却有很多差别 拿下面的矩阵举例
a = x[[1,2,0],[0,2,1]]
b = x[np.ix_([1,2,0],[0,2,1])]
a 表示的是取(1,0),(2,2),(0,1) 对应的元素, 即[4,9,2] b 表示的是取 1,2,0行,变成如下,
然后纵坐标按照[0,2,1]为