Ndarray对象
NumPy 最重要的一个特点是其 N 维数组对象 ndarray
ndarray 对象是用于存放同类型元素的多维数组
ndarray 内部由以下内容组成:
- 一个指向数据(内存或内存映射文件中的一块数据)的指针。
- 数据类型或 dtype,描述在数组中的固定大小值的格子。
- 一个表示数组形状(shape)的元组,表示各维度大小的元组。
- 一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要"跨过"的字节数。
创建一个 ndarray 只需调用 NumPy 的 array 函数即可:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
image.png
插:
numpy array 类的reshape的用法
eg:
x = np.zeros((2,3,4))
x 是一个三维的零向量
x.reshape(2,3,2,2)
x 变成四维
x.reshape(-1)
返回x直接展开为1维的数组,但是x不变。和x.reshape(1,-1)等价
x 的总元素个数: 2*3*4 = 24个
那么x.reshape(n,-1) 返回x展开成(n, 24/n)的数组
同理:x.reshape(-1, n)返回x展开成(24/n, n)的数组
x.reshape(n1,n2,-1) 返回x展开成 (n1, n2, 24/(n1*n2))的数组
ndarray的一些常见属性:
-
ndarray.ndim:
秩,即轴的数量或维度的数量 -
ndarray.shape:
数组的维度,对于矩阵,n 行 m 列
返回值是一个元组
如:a = np.array([[1,2,3],[4,5,6]])
a.shape -> (2,3)
通过给shape赋值还可以改变ndarray的结构:
image.png -
ndarray.size:
数组元素的总个数,相当于 .shape 中 n*m 的值
Numpy创建数组
-
numpy.empty
numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组:
numpy.empty(shape, dtype = float, order = 'C')
image.png
注意 : 数组元素为随机值,因为它们未初始化。
- numpy.zeros
创建指定大小的数组,数组元素以 0 来填充:
numpy.zeros(shape, dtype = float, order = 'C')
注: 默认为浮点数,可以自己设置数字类型,eg:
y = np.zeros((5,), dtype = np.int) - numpy.ones
用 1 来填充数组
Numpy从已有的数组创建数组:
-
numpy.asarray
numpy.asarray(a, dtype = None, order = None)
image.png
可以把列表,元组等作为参数a传入asarray中转化为ndarray
- numpy.frombuffer
numpy.frombuffer 用于实现动态数组。
numpy.frombuffer 接受 buffer 输入参数,以流的形式读入转化成 ndarray 对象。 - numpy.fromiter
numpy.fromiter 方法从可迭代对象中建立 ndarray 对象,返回一维数组。
NumPy 从数值范围创建数组
- numpy.arange
numpy.arange(start, stop, step, dtype)
start : 起始值,默认为0
stop : 终止值(不包含)
step: 步长,默认为1
dtype:返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。
x = np.arange(5)
x -> [0 1 2 3 4]
- numpy.linspace
numpy.linspace 函数用于创建一个一维数组,数组是一个等差数列构成的,格式如下:
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
start : 序列的起始值
stop:序列的终止值,如果endpoint为true,该值包含于数列中
num : 要生成的等步长的样本数量,默认为50
endpoint : 该值为 true 时,数列中包含stop值,反之不包含,默认是True。
retstep : 如果为 True 时,生成的数组中会显示间距,反之不显示。
dtype: ndarray 的数据类型
扩展:
b =np.linspace(1,10,10).reshape([10,1])
b ->
[[ 1.]
[ 2.]
[ 3.]
[ 4.]
[ 5.]
[ 6.]
[ 7.]
[ 8.]
[ 9.]
[10.]]
- numpy.logspace
numpy.logspace 函数用于创建一个于等比数列。格式如下:
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
注:
start : 起始值为 base ^ start eg:base = 10 start = 1,起始值为10,start = 2 ,起始值为100
stop:同理
剩余同理
NumPy 切片和索引
切片
- slice 定义切片:
a = np.arange(10)
s = slice(2,7,2) # 从索引2开始切,到索引7截至,步长为2
print(a[s]) -> [2,4,6]
- 冒号切片:
和python 的list切片一致 - 带有省略号的切片:
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
a[...,1] # 第二列元素 -> [2 4 5]
a[1,...] # 第二行元素 -> [3,4,5]
a[...,1:] # 第二列及剩下的所有元素:
[[2 3]
[4 5]
[5 6]]
Numpy 广播:
例子:
设有两个数组 a 和 b,如果两个数组的形状相同,a.shape == b.shape , 那么
a*b 的结果就是a与b数组对应为相乘。这要求a和b维度相同而且各维度的长度相同。
当运算中的两个数组形状不相同时,numpy自动触发广播机制。
a = np.array([[ 0, 0, 0],
[10,10,10],
[20,20,20],
[30,30,30]])
b = np.array([1,2,3])
print(a + b)
->
[[ 1 2 3]
[11 12 13]
[21 22 23]
[31 32 33]]
由此可见,numpy自动把 b 变化成了 [[1,2,3],[1,2,3],[1,2,3],[1,2,3]],以便和a做相加
- np.tile(a,(m,n))
就是将矩阵 a 横向复制为原来的m倍,纵向赋值为原来的n倍
数组修改操作
image.png待续
网友评论