numpy基础知识
ndarray 对象
ndarray对象的属性
表示一个 n 维数组, 描述相同类型的元素集合, 基于0的索引访问
创建 ndarray
1 | numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0) |
- object: 可以返回一个数组或任何(嵌套)序列的对象。
- dtype: 数据类型对象
- copy: 对象是否被复制
- order:
C
安行,F
按列, 或者默认(A
) - subok: 默认情况下,返回的数组被强制为基类数组。 如果为true,则返回子类
- ndmin: 指定返回数组的最小维数。
1 | # 最小维度 |
numpy.array
中的 object
传入参数必须是同一结构的, 否则将进行自动类型转换, 如果指定了 dtype
参数, 则以该参数类型为准(规则与C++类似)
ndarray对象的方法
ndarray.ptp(axis=None, out=None)
ndarray.clip()
ndarray.all()
ndarray.any()
ndarray.swapaxes(axis1, axis2)
numpy支持的数据类型
数据类型对象 dtype
dtype是一个对象, 这个对象所属类的名字叫做 “数据类型”
dtype 通常用于结构化数据类型:
1 | import numpy as np |
numpy基本操作
根据下标组成新的数组
1 | a = np.asarray([1,2,3,4,5,6,7,8,9]) |
比较运算符
1 | a = np.array([[1,2,3], [1,2,4]], dtype= float ,ndmin = 2) |
向量运算
矩阵运算
矩阵运算主要注意的是axis
参数的选择, axis参数的作用是, 沿着axis参数进行运算, 即运算后, 其他维度不变, axis指定的维度消失(所以维度会减1)
numpy常用函数
ndarray对象的创建
np.array
该函数会返回一个ndarray对象(注意numpy中不存在array
这种数据对象类型).
np.ndarray
该函数也会返回一个ndarray对象, 但是不推荐使用(为啥?), np.ndarray是一个底层的方法, 会被其他多维数组创建方法所调用
np.zeros()
生成默认元素为 0.
(注意是float64类型)的ndarray
1 | np.zeros ((3,4)) |
np.ones()
生成默认元素为 1.
(注意是float64类型)的ndarray
1 | z = np.ones ((3,4)) |
np.arange()
指定范围和数值间的间隔生成 array,注意范围包左不包右
1 | l = np.arange(0,10,2) |
np.random
np.random.random:1
2
3
4
5random, 生成0~1的随机小数,默认类型为float64, 还有其他更多类型的random
np.random.random((2,3))
array([[ 0.86166627, 0.37756207, 0.94265883],
[ 0.9768257 , 0.96915312, 0.33495431]])
np.random.randn: 从标准正态分布中随机输出1
numpy.random.randn(d1,d2,...,dn) # d1,d2,...,dn为维度
np.random.rand: 生成[0,1)之间的随机数据1
numpy.random.rand(d1,d2,...,dn) # d1,d2,...,dn为维度
ndarray.reshape()
可以对ndarray的维度重新进行调整
1 | arr = np.arange(15).reshape(3, 5) |
数组拼接
np.append()
np.append(arr, values, axis=None)
参数:
- arr
返回:
np.concatenate()
统计类数值
np.median()
1 | numpy.median(a, axis=None, out=None, overwrite_input=False, keepdims=False) |
沿着指定的轴计算中位数
参数:
- a: 类似数组的变量. 不一定非要是
ndarray
类型, 只要是任何可以转换成ndarray
类型的数据变量都可以
np.mean()
1 | numpy.mean(a, axis=None, dtype=None, out=None, keepdims=<no value>) |
返回沿着指定轴的算数平均值
参数:
- a: 类似数组的变量.
- dtype: 数据类型, 可选参数. 对于整数输入来说, 默认返回值为
float64
, 对于其他floating
输入来说, 返回值类型与输入类型保持一致.
np.round()
np.newaxis
np.stack()
函数原型为 stack(arrays, axis=0)
, 其中, arrays
既可以是列表, 也可以是数组. 其作用是沿着指定的维度(axis
)将数组(如果是列表, 就先将列表转化成numpy数组)中的元素 “堆叠” 起来, 代码示例如下:
首先, 对于列表或者元组, 是 np.stack
会首先将这些列表和元组转化成 numpy 数组, 也可以看做是对将列表作为参数传入到 np.asarray()
中, 例如, 下面的两种写法是等价的:
1 | a = [[1,2,3], [4,5,6]] |
即使 a
和 b
本身就是 numpy 数组, 也可以使用 np.asarray()
, 如下所示:1
2
3
4
5a = np.array([1,2,3])
b = np.array([2,3,4])
# 下面两种方式等价
c = np.stack((a,b), axis=0)
c = np.stack(np.asarray((a,b)), axis=0)
下面我们来看看其他更多的情况
1 | import numpy as np |
我们发现, a 的值没有发生变化, 实际上就是这样, 因为我们沿着第一维(0轴), 就是相当于 将数组其他维保持不变, 只将0轴堆叠, 也就是将: a[0], a[1], a[2],...
堆叠起来 , 就形成了一个新的数组 a_0 = [a[0] a[1] a[2] ... ]
, 仔细观察, 这实际上就是 a
. 当 axis=1
时, 我们需要保持其他轴不变, 只将 axis=1
轴上的元素堆叠起来, 也就是要分别将 a[0][0], a[1][0]
, a[0][1], a[1][1]
, 以及 a[0][2], a[1][2]
堆叠起来.
下面我们再看一个例子来总结 axis
参数的作用1
2
3
4
5
6
7
8
9
10
11
12a=[[1],[2],[3]]
b=[[1],[2],[3]]
c=[[1],[2],[3]]
d=[[1],[2],[3]]
s1 = np.stack((a,b,c,d), axis=0)
s2 = np.stack((a,b,c,d), axis=1)
s3 = np.stack((a,b,c,d), axis=2)
print(s1.shape) # (4, 3, 1)
print(s2.shape) # (3, 4, 1)
print(s3.shape) # (3, 1, 4)
可以看出, 经过 np.stack(array, axis=n)
操作后, 新的数组的 shape 值会使得原来第一维的大小移动到 axis
指定的维度, 而其他维的大小会相应移动, 但是相对位置不变
知道了维度的变化后, 对于 “堆叠” 的理解就会变得容易得多, 具体来说, 令 n=np.asarray((a,b,c,d))
:
- 对于
axis=0
, 我们堆叠的是:n[0], n[1], n[2], a[3]
; 每个n[i]
的维度都是 3×1, 故而最终的维度为 4×3×1 - 对于
axis=1
, 我们堆叠的是:n[0][i], n[1][i], a[2][i], a[3][i] for i in range(3)
; 每个元素的维度均为 - 对于
axis=2
, 我们堆叠的是:n[0][..][i], n[1][..][i], n[2][..][i], n3[..][i] for i in range(1)
, 式中的[..]
范围为 0~2, 姑第一维的维度就是 3, 后面的两个维度就是 1×4 (因为i只有0这一种情况)
np.hstack()
np.vstack()
直接用一个较复杂的情况来说明 vstack()
对维度的影响:
1 | a=[[[1],[2],[3]],[[1],[2],[3]]] # shape: (2, 3, 1) |
根据维度的变化, 我们很容易知道 vstack()
的作用实际上就是将前两维的元素合成一维, 可以简单理解成一种平铺展开的方式, 如下所示1
2
3
4a= np.array([[[1],[2],[3]],[[1],[2],[3]]])
print(a.shape) # (2, 3, 1)
print(np.vstack(a)) # (6, 1)
# [[1] [2] [3] [1] [2] [3]]
但是注意, 如果传入的数组本身只有两维, 那么就不会将这两维合并, 如下所示:
1 | a = np.array([[1,2,3],[1,2,3]]) # (2, 3) |
https://blog.csdn.net/csdn15698845876/article/details/73380803
np.prod()
乘积
np.newaxis
np.newaxis
在使用上和功能上等价于 None, 使用示例如下:
1 | x = np.arange(3) # x = array([0 1 2]) |