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=Noneout=Nonekeepdims=Falseinitial=<no value>where=True)

ndarray.max(axis=Noneout=Nonekeepdims=Falseinitial=<no value>where=True)

ndarray.sum(axis=Nonedtype=Noneout=Nonekeepdims=Falseinitial=0where=True)

它们等价于:

numpy.amin(aaxis=Noneout=Nonekeepdims=<no value>initial=<no value>where=<no value>)

numpy.amax(aaxis=Noneout=Nonekeepdims=<no value>initial=<no value>where=<no value>)

numpy.sum(aaxis=Nonedtype=Noneout=Nonekeepdims=<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(about=None)

如果ab都是一维数组,则它是向量的内积. (对应位相乘,然后相加)

如果ab都是二维数组,则是矩阵乘法,但首选使用matmul或。a @ b

如果ab是 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]]