目录结构
Introduce
Numpy是Python的一个开源的数值计算扩展包。
- Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁高效的多。
- Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。
- 官网:https://numpy.org/
Numpy基础数据结构ndarray
ndarray由两部分组成:
1.实际的数据
2.描述这些数据的元数据
# 多维数组ndarray
import numpy as np
ar = np.array([1,2,3,4,5,6,7])
print(ar) # 输出数组,注意数组的格式:中括号,元素之间没有逗号(和列表区分)
print(ar.ndim) # 输出数组维度的个数(轴数),或者说“秩”,维度的数量也称rank
print(ar.shape) # 数组的维度,对于n行m列的数组,shape为(n,m)
print(ar.size) # 数组的元素总数,对于n行m列的数组,元素总数为n*m
print(ar.dtype) # 数组中元素的类型,类似type()(注意了,type()是函数,.dtype是方法)
print(ar.itemsize) # 数组中每个元素的字节大小,int32l类型字节为4,float64的字节为8
print(ar.data) # 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。
ar # 交互方式下输出,会有array(数组)
# 数组的基本属性
# ① 数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推
# ② 在NumPy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的数量:
# 比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组
# 所以一维数组就是NumPy中的轴(axes),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。
# 而轴的数量——秩,就是数组的维数。
[1 2 3 4 5 6 7]
1
(7,)
7
int32
4
<memory at 0x0000021876391F40>
array([1, 2, 3, 4, 5, 6, 7])
一、创建数组(ndarray对象)
1. 使用列表、元祖、数组、生成器创建ndarray对象
2. np.arange() 方法创建
3. np.linspace() 方法创建
4. 通过np内部特定的方法创建
- zeros()
- zeros_like()
- ones()
- ones_like()
- eye()
# 创建数组:array()函数,括号内可以是列表、元祖、数组、生成器等
ar1 = np.array(range(10)) # 整型
ar2 = np.array([1,2,3.14,4,5]) # 浮点型
# 可以是任意类型,但不推荐将非数字类型数据放入numpy处理
ar3 = np.array([[1,2,3],('a','b','c')]) # 二维数组:嵌套序列(列表,元祖均可)
ar4 = np.array([[1,2,3],('a','b','c','d')]) # 注意嵌套序列数量不一会怎么样
print_info = lambda ar : print(ar,'\n',type(ar),'\n',ar.dtype,'\n',ar.ndim,'\n',ar.size,'\n','*'*30)
print_info(ar1)
print_info(ar2)
print_info(ar3) # 二维数组,共6个元素,元素为Unicode 类型
print_info(ar4) # 一维数组,共2个元素,元素为object 类型
[0 1 2 3 4 5 6 7 8 9]
<class 'numpy.ndarray'>
int32
1
10
******************************
[1. 2. 3.14 4. 5. ]
<class 'numpy.ndarray'>
float64
1
5
******************************
[['1' '2' '3']
['a' 'b' 'c']]
<class 'numpy.ndarray'>
<U11
2
6
******************************
[list([1, 2, 3]) ('a', 'b', 'c', 'd')]
<class 'numpy.ndarray'>
object
1
2
******************************
<ipython-input-23-2a69c3dbf06c>:8: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
ar4 = np.array([[1,2,3],('a','b','c','d')]) # 注意嵌套序列数量不一会怎么样
# 创建数组:arange(),类似range(),在给定间隔内返回均匀间隔的值。
print(np.arange(10)) # 返回0-9,整型
print(np.arange(10.0)) # 返回0.0-9.0,浮点型
print(np.arange(5,12)) # 返回5-11
print(np.arange(5.0,12,2)) # 返回5.0-12.0,步长为2
print(np.arange(10000)) # 如果数组太大而无法打印,NumPy会自动跳过数组的中心部分,并只打印边角:
[0 1 2 3 4 5 6 7 8 9]
[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
[ 5 6 7 8 9 10 11]
[ 5. 7. 9. 11.]
[ 0 1 2 ..., 9997 9998 9999]
# 创建数组:linspace():返回在间隔[开始,停止]上计算的num个均匀间隔的样本。
ar1 = np.linspace(2.0, 3.0, num=5)
ar2 = np.linspace(2.0, 3.0, num=5, endpoint=False)
ar3 = np.linspace(2.0, 3.0, num=5, retstep=True)
print(ar1,type(ar1))
print(ar2)
print(ar3,type(ar3))
# numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
# start:起始值,stop:结束值
# num:生成样本数,默认为50
# endpoint:如果为真,则停止是最后一个样本。否则,不包括在内。默认值为True。
# retstep:如果为真,返回(样本,步骤),其中步长是样本之间的间距 → 输出为一个包含2个元素的元祖,第一个元素为array,第二个为步长实际值
[ 2. 2.25 2.5 2.75 3. ] <class 'numpy.ndarray'>
[ 2. 2.2 2.4 2.6 2.8]
(array([ 2. , 2.25, 2.5 , 2.75, 3. ]), 0.25) <class 'tuple'>
# 创建数组:zeros()/zeros_like()/ones()/ones_like()
ar1 = np.zeros(5)
ar2 = np.zeros((2,2), dtype = np.int)
print(ar1,ar1.dtype)
print(ar2,ar2.dtype)
print(