数据操作之numpy模块1——数组的创建、属性、数据类型

系列文章:
数据分析之numpy模块2——数组的切片、变形、级联、拆分与数学计算
数据分析之numpy模块3——数组的排序、乱序、索引与上下限设置

认识numpy模块

NumPy(Numerical Python) 是 Python 语言中做科学计算的基础库。重在于数值计算,也是大部分Python科学计算库的基础,多用于在大型、多维数组上执行的数值运算。

# 导入numpy库
import numpy as np

数组与列表的区别

1) 数组中存储的数据元素类型必须是统一类型;
2)优先级:

字符串 > 浮点型 > 整数;
当输入不同数据类型时,会被强转为优先级高的数据类型;


数组的创建

  • 一维数组即是我们常说的向量(一阶张量);
  • 二维数组即是我们常说的矩阵(二阶张量);
  • 多维数组再往上需要使用张量表示,常量就是零阶张量。

1. 使用array创建数组

  • 相同数据类型的列表作为参数,使用逗号分隔每个列表,可以生成不同维度的数组。

1.1 np.array创建一维数组

import numpy as np
arr = np.array([1,2,3])

输出:array([1, 2, 3])

1.2 np.array创建多维数组

arr = np.array([[1,2,3],[4,5,6]])
arr

输出:array([[1, 2, 3],
        [4, 5, 6]])

1.3 np.array尝试创建包含多种数据类型的数组

arr = np.array([1,2.2,3])
arr

输出:array([1. , 2.2, 3. ])

  • 可以看到数据类型被强制转换为浮点类型;

2. 使用zeros创建全0数组

  • 通过设置shape参数,生成一个全由0构成的指定形状的多维数组(默认浮点型)
np.zeros(shape=(3,4))

输出:array([[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]])

  • 通过设置dtype参数可以修改数据类型为整型等其他类型
np.zeros(shape=(3,4),dtype=np.int32)

输出:array([[0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0]])

3. 使用ones创建全1数组

  • 通过设置shape参数,生成一个全由1构成的指定形状的多维数组(默认浮点型)
np.ones(shape=(3,4))

输出:array([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]])

  • 通过设置dtype参数可以修改数据类型为整型等其他类型
np.ones(shape=(3,4),dtype=np.int32)

输出:array([[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]])

4. 使用linspace创建等间隔数组

  • 在给定的范围内生成含num个数据的一维等间隔数列数组,需要使用其他方法升维
np.linspace(0,100,num=20)

输出:array([ 0. , 5.26315789, 10.52631579, 15.78947368,
      21.05263158, 26.31578947, 31.57894737, 36.84210526,
      42.10526316, 47.36842105, 52.63157895, 57.89473684,
      63.15789474, 68.42105263, 73.68421053, 78.94736842,
      84.21052632, 89.47368421, 94.73684211, 100. ])

5. 使用arange创建等差数组

  • 在给定的范围内生成步长为step的一维等差数列数组,需要使用其他方法升维
np.arange(10,50,step=2)

输出:array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42,
      44, 46, 48])

6. 使用random创建随机数组

6.1 np.random.randint 创建整型随机数组

  • 在给定的范围内生成指定指定形状的多维随机数列数组,默认数据类型为整型
  • 不设置size时生成的不是数组,而是一个指定范围内的随机整数
np.random.randint(0,100,size=(5,3)) 

输出:array([[19, 0, 17],
       [72, 29, 13],
       [69, 59, 68],
       [63, 54, 87],
       [70, 64, 0]])

6.2 np.random.normal 创建正态分布随机数组

  • numpy.random.normal(loc=0.0,scale=1.0,size=None)参数说明:

参数loc(float):正态分布的均值。
参数scale(float):正态分布的标准差。
参数size(int或者整数元组):输出数组的形状,默认为None。

  • 各参数不指定时的情况:

1)无参数时,返回的是一个标准正态分布(均值为0,标准差为1)下的随机值
2)仅输入一个数值,将返回一个均值loc为输入值,标准差为1的正太分布下的随机值
3)输入两个数值,将返回一个均值loc为输入值1,标准差scale为输入值2的正态分布下的随机值
4)输入两个数值,外加一个数值N,将返回一个均值loc为输入值1,标准差scale为输入值2的正太分布下的(N,)的一维数组,包含N个数字。
5)输入两个数值,外加一个元组(M,N),将返回一个均值loc为输入值1,标准差scale为输入值2的正太分布下的(M,N)的二维数组,包含M*N个数字。

np.random.normal(0,1,5)

输出:[ 1.3315865 0.71527897 -1.54540029 -0.00838385 0.62133597]

  • 注意:正态分布数组指的是数组内部,不同区间的数据个数占比符合正态分布,我们可以绘制直方图查看
import matplotlib.pyplot as plt
# 绘图查看
s=np.random.normal(0,1,10000000)
plt.hist(s,bins=100)
plt.show()

绘标准正态分布图1

6.3 np.random.rand 创建均匀分布随机数组

  • rand(n,m)生成一个0-1之间的n*m的均匀随机矩阵
np.random.rand(10000,100)

输出:array([[6.32393809e-01, 4.25896509e-01, 1.92858279e-01, …,
      5.12963811e-01, 9.44592221e-01, 6.88901172e-01],
       [5.31388037e-01, 5.26622301e-02, 1.43953341e-01, …,
      7.64786930e-01, 2.39814625e-01, 1.14334103e-01],
       [8.78206312e-01, 6.46987813e-01, 3.91696529e-01, …,
      5.23202345e-01, 2.93595486e-01, 6.89222564e-01],
       …,
       [4.22641621e-01, 6.42861196e-01, 1.05759087e-01, …,
      9.34267242e-01, 4.84845268e-01, 6.89652018e-01],
       [7.53819599e-01, 8.61629036e-01, 9.20819485e-01, …,
      5.62177531e-04, 4.18046901e-01, 1.96747276e-01],
       [1.49670429e-01, 5.40383374e-01, 6.56995314e-01, …,
      5.90408060e-01, 3.80012454e-01, 1.72216829e-02]])

  • 如果不指定size,那么生成的是一个0-1之间的随机浮点数
np.random.rand()

输出:0.4942851822609876

  • 注意:这里的均匀分布同样是指数组内部,不同区间的数据个数占比分布均匀,我们可以绘制直方图查看
import matplotlib.pyplot as plt
# 绘图查看
X=random.rand(10000,100)
plt.hist(X,bins=100)
plt.show

绘制均匀分布图

6.4 np.random.randn 创建标准正太分布随机数组

  • 其效果相当于np.random.normal(0,1,size=(n,m)),一般用于生成形状为n*m标准正太分布随机数组
import matplotlib.pyplot as plt
# 绘图查看
Y=random.randn(10000,100)
plt.hist(Y,bins=100)
plt.show

绘制标准正态分布图2

6.5 np.random.seed 创建标准正太分布随机数组

  • 用于指定随机数/数组生成时所用的算法开始的整数值
  • 如果代码中每次执行都使用相同的种子,所生成的随机数/数组是相同的
for i in range(5):
    np.random.seed(10)
    print(np.random.normal(0,1,5))

输出:[ 1.3315865 0.71527897 -1.54540029 -0.00838385 0.62133597]
   [ 1.3315865 0.71527897 -1.54540029 -0.00838385 0.62133597]
   [ 1.3315865 0.71527897 -1.54540029 -0.00838385 0.62133597]
   [ 1.3315865 0.71527897 -1.54540029 -0.00838385 0.62133597]
   [ 1.3315865 0.71527897 -1.54540029 -0.00838385 0.62133597]


数组的属性

arr = np.random.randint(0,100,size=(5,6))
arr

输出:
array([[62, 65, 51, 15, 30, 63],
   [37, 8, 55, 70, 13, 84],
   [46, 44, 86, 11, 72, 91],
   [10, 47, 3, 96, 9, 36],
   [54, 24, 55, 72, 29, 45]])

1. shape:返回值是数组的形状

arr.shape

输出:(5, 6)

2. ndim:返回值是数组的维度数

arr.ndim

输出:2

3. size:返回值是数组元素的个数

arr.size

输出:30

4. dtype:返回值是数组元素的数据类型

arr.dtype

输出:dtype(‘int32’)

type(arr) #数组的数据类型

输出:numpy.ndarray

5. strides :每个维度的元素之间的字节数间隔

arr.strides

输出:(24, 4)

6. itemsize:每个元素的字节数

arr.itemsize

输出:4

7. nbytes:总的字节数

arr.nbytes

输出:120

8. data:存储数据的数据块

arr.data

输出:<memory at 0x000001C825526450>

9. flags:array的标志位 OWNDATA=True

arr.flags

输出:C_CONTIGUOUS : True
   F_CONTIGUOUS : False
   OWNDATA : True
   WRITEABLE : True
   ALIGNED : True
   WRITEBACKIFCOPY : False
   UPDATEIFCOPY : False


数组的数据类型

数据类型表格如下:
numpy数据类型

arr = np.array([1,2,3])
arr.dtype

输出:dtype(‘int32’)

1. array(dtype=?):可以设定数据类型

#创建一个数组,指定数组元素类型为int32
arr = np.array([1,2,3],dtype='int32')
arr.dtype

输出:dtype(‘int32’)

2. arr.dtype = ‘?’:可以修改数据类型

arr.dtype = 'uint8' #修改原数组的元素类型
arr.dtype

输出:dtype(‘uint8’)

  • 注意:这种方法适用于相同字节的不同数据类型间相互转换,如果由高字节转为低字节,由于创建时分配的空间不变,但单个元素所占字节数减少,最终多出来的空间会用0填补,原数组数据会被破坏且总字节数nbytes不变。

3. arr.astype(’?’):可以间接修改数据类型

arr8 = arr.astype('int8') #不修改原数组的元素类型,用一个新的对象承载原ndarray数组,但其元素的数据类型是修改后的
arr8.dtype

输出:dtype(‘int8’)

  • 注意:可以调用flags属性查看arr8,可知该ndarray不是该变量名所拥有的,而是arr变量所拥有的,arr8只是作为第三方使用了该数组,并且以新的数据类型显示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值