0. ndarray结构:
numpy的特点之一就是N维数组--ndarray.
ndarray是一系列同类型数据的集合,其中的每个元素在内存中都有相同的存储大小区域。
ndarray内部,由以下部分组成:
A. 一个指向数据的指针。
B. 元素数据类型或dtype. 用来确定每个元素在内存中的大小。
C. 一个表示ndarray形状(shape)的元组。用来确定各维度的大小。
D. 一个跨度(stride)元组。用来确定跨越到下个元素的步长。
1. ndarray创建:
要创建ndarray. 只需要调用np.array():
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
名称 | 描述 |
---|---|
object | 数组或嵌套的数列 |
dtype | 数组元素的数据类型,可选 |
copy | 对象是否需要复制,可选 |
order | 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) |
subok | 默认返回一个与基类类型一致的数组 |
ndmin | 指定生成数组的最小维度 |
import numpy as np
arr1 = np.array([3,4,5])
print("arr1:",arr1)
print("type:",type(arr1))
print("shape:",arr1.shape)
arr2 = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9],[10, 11, 12]])
print("arr2:",arr2)
print("type:",type(arr2))
print("shape:",arr2.shape)
arr3 = np.array([1, 2, 3], ndmin= 3)
print("arr3:",arr3)
print("type:",type(arr3))
print("shape:",arr3.shape)
arr1: [3 4 5] type: <class 'numpy.ndarray'> shape: (3,) arr2: [[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]] type: <class 'numpy.ndarray'> shape: (4, 3) arr3: [[[1 2 3]]] type: <class 'numpy.ndarray'> shape: (1, 1, 3)
2. ndarry的索引:
索引就是通过一个无符号整数获取ndarray的值。
对一维ndarray, 单个索引值表示元素标量。
对二维ndarray,单个索引值表示对应的一维ndarray.
对N维ndarray,单个索引值表示对应的(N-1)维ndarray.
arr1 = np.array([3,4,5])\
print(arr1[1],"\n")
4
arr2 = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9],[10, 11, 12]])
print(arr2[1], "\n")
[4 5 6]
print(arr2[1][2])
6
因为既然arr2[1]是一个一维ndarray. 那arr2[1][2]就是这个一维数组[4,5,6]的第index=2个。即为6.
更常用的方法是:
print(arr2[1,2])
6
3. ndarry的切片:
4. ndarray的min(), max(), sum()等:
ndarray.min(axis=None, out=None, keepdims=False, initial=<no value>, where=True)
ndarray.max(axis=None, out=None, keepdims=False, initial=<no value>, where=True)
ndarray.sum(axis=None, dtype=None, out=None, keepdims=False, initial=0, where=True)
它们等价于:
numpy.amin(a, axis=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)
numpy.amax(a, axis=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)
numpy.sum(a, axis=None, dtype=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)
它们分别是:
返回最小值--沿着给定的axis
返回最大值--沿着给定的axis.
返回元素的和--沿着给定的axis.
arr4 = np.array([[1, 2, 3], [4, 5, 6]])
print("min()", arr4.min())
print("min(0)", arr4.min(0))
print("min(1)", arr4.min(1))
axis:
如果不选。则是全领域求最小值,最大值,和值。
如果选0. 则表明在这个轴线上求最小值,最大值,和值。
如果是shape=(m, n). 则结果是 shape(1,n)的ndarray.
arr4 = np.array([[1, 2, 3], [4, 5, 6]])
print("min()", arr4.min())
print("min(0)", arr4.min(0))
print("min(1)", arr4.min(1))
min() 1 min(0) [1 2 3] min(1) [1 4]
print("max() :", arr4.max())
print("max(0):", arr4.max(0))
print("max(1):", arr4.max(1))
max() : 6 max(0): [4 5 6] max(1): [3 6]
5. ndarray的加减乘除:
算术函数包含简单的加减乘除: add(),subtract(),multiply() 和 divide()
也可以直接使用 “+” , “-” , “*” , "/"来进行计算。
如此,则ndarray的对应元素进行加减乘除操作。
arr5 = np.array([[0, 1, 2], [3, 4, 5]])
arr6 = np.array([[2, 2, 2], [2, 2, 2]])
print("Add:")
print(arr5 + arr6)
print(np.add(arr5, arr6))
print("Sub:")
print(arr5 - arr6)
print(np.subtract(arr5, arr6))
print("Mul:")
print(arr5 * arr6)
print(np.multiply(arr5, arr6))
print("Div:")
print(arr5 / arr6)
print(np.divide(arr5, arr6))
Add: [[2 3 4] [5 6 7]] [[2 3 4] [5 6 7]] Sub: [[-2 -1 0] [ 1 2 3]] [[-2 -1 0] [ 1 2 3]] Mul: [[ 0 2 4] [ 6 8 10]] [[ 0 2 4] [ 6 8 10]] Div: [[0. 0.5 1. ] [1.5 2. 2.5]] [[0. 0.5 1. ] [1.5 2. 2.5]]
5.1:广播后的ndarray计算。
5.2:ndarray与整数计算:
先对整数进行广播,将之转换成与ndarray的shape相同。再计算。
6. 矩阵乘法:
在numpy中,可以使用numpy.ndarray的二维模式表示矩阵。也可以使用matrix表示矩阵。但推荐使用ndarray.
矩阵乘法:
如果ndarray为2维的,则numpy.dot()和np.matmul()函数结果相同。都是矩阵相乘。
从 Python 3.5 和 Numpy 1.10 以后,可以使用中缀操作符 @
计算 ndarray 间的矩阵乘法,写起来更加方便。
以下详细介绍np.dot()
numpy.dot(a, b, out=None)
如果a和b都是一维数组,则它是向量的内积. (对应位相乘,然后相加)
如果a和b都是二维数组,则是矩阵乘法,但首选使用matmul或。a @ b
如果a或b是 0-D(标量),则等效于multiply . 并且推荐使用numpy.multiply(a, b) 或
a * b。(见5.2)
举例说明矩阵相乘规则:
a = np.array([[1,2],[3,4]]) b = np.array([[11,12],[13,14]]) print(np.dot(a,b))
输出结果为:
[[37 40] [85 92]]
计算式为:
[[1*11+2*13, 1*12+2*14],[3*11+4*13, 3*12+4*14]]