5.科学计算模块Numpy(2)随机数的生成和ndarray属性及其创建方式

引言

通过上一篇4.科学计算模块Numpy(1)概述与初始操作-CSDN博客,我们已经了解了Numpy的概念和Numpy数组的创建,今天我们来介绍一下Numpy模块中随机数的生成和ndarray属性及其创建方式。

通过阅读本篇博客,你可以:

1.掌握如何使用numpy.random模块生成随机数

2.了解ndarray数组的属性

3.掌握ndarray的多种创建方式

一、随机数的创建

numpy中的random模块包含了很多方法可以用来产生随机数,对random的一些常用方法如下图。

1.random

import numpy as np
np.random.random()

random()函数用于生成一个 [0.0, 1.0) 范围内的随机浮点数。

代码示例如下:

import numpy as np

#从[0.0,1.0)中随机生成一个浮点数
arr = np.random.random()
print(arr)    # 0.5930548452162513

2.randint

import numpy as np
np.random.randint(low, high=None, size=None)

randint()函数有三个参数low、high、size,如果只输入了low,那么会随机数的范围就是[0,low)。如果输入了high,那么随机数的范围就是[low,high)size则是指生成数的个数与维度。

代码示例如下:

import numpy as np

#生成一个3 * 4 的数组,元素是[1,10)范围中的整数
arr = np.random.randint(1, 10, size=(3, 4))
print(arr) 
'''[[6 2 2 7]
    [7 4 4 8]
    [5 1 7 3]]'''

3.shuffle

import numpy as np
np.random.shuffle()

shuffle()函数可以对输入的数组进行原地随机排序。通俗地讲,就是打乱数组。

代码示例如下:

import numpy as np

#对数组进行打乱,原地随机排序
arr = np.array([1, 2, 3, 4, 5])
np.random.shuffle(arr)
print(arr)    # [4 3 2 1 5]

4.randn

import numpy as np
np.random.randn(d0,d1,...,dn)

randn()函数是用于生成标准正态分布(均值为0,方差为1)的随机数的函数。

d0, d1, …, dn: 这些参数定义了返回数组的形状。如果指定了这些参数,randn将返回一个具有指定形状的数组。如果不指定任何参数,则返回一个标量值。

代码示例如下:

import numpy as np

#生成一个2 * 3 的数组,元素遵循标准正态分布(均值为0,方差为1)
arr = np.random.randn(2, 3)
print(arr)
"""[[ 0.73397829  1.19266785 -0.54131104]
    [ 0.09698159  1.2247052   0.18207709]]
"""

5.permutation

import numpy as np
np.random.permutation(x)

permutation()函数可以用来生成随机排列。如果参数x输入的是一个数组,那么permutation会生成这个数组的随机排列。如果是一个整数,那么permutation会生成一个数组排列,元素的范围是[0,x)

代码示例如下:

import numpy as np

# 生成数组的随机排列
arr = np.array([1, 3, 4, 5, 6, 9])
res = np.random.permutation(arr)
print(res)    #[6 5 4 1 3 9]


#生成范围为[0,10)的随机排列
arr = np.random.permutation(10)
print(arr)    #[1 8 3 7 2 9 6 0 5 4]

6.rand

import numpy as np
np.random.rand(d0, d1, ..., dn)

rand()函数用于生成指定形状的数组,数组中的元素服从均匀分布(均匀分布是指在指定范围内,每个数值的出现概率是相等的)。rand()函数生成的是[0,1)区间内的浮点数。

d0, d1, ..., dn:这些参数定义了返回数组的形状。如果指定了这些参数,rand将返回一个具有指定形状的数组。如果不指定任何参数,则返回一个标量值。

代码示例如下:

import numpy as np

# 生成 4 * 2 的数组,元素范围是[0,1)
arr = np.random.rand(4, 2)
print(arr)
"""[[0.02455501 0.81638666]
    [0.19310181 0.899731  ]
    [0.14040743 0.43266617]
    [0.69985267 0.60746816]]
"""

7.seed

import numpy as np
np.random.seed(seed=None)

seed()函数是用于设置随机数生成器种子的函数,使用相同的种子可以确保每次运行程序时生成的随机数序列相同,可以确保调试和测试代码时的随机数确定而不对测试产生影响。

代码示例如下:

①设置种子并生成随机数

import numpy as np

np.random.seed(42)  # 设置随机数生成器的种子
print(np.random.rand(3))  # 输出: [0.37454012 0.95071431 0.73199394]

②不设置种子,生成随机数 

import numpy as np

print(np.random.rand(3))  # 可能输出: [0.2488251  0.58212728 0.77087943]

③重新设置种子

import numpy as np

np.random.seed(42)
print(np.random.rand(3))  # 输出: [0.37454012 0.95071431 0.73199394]

np.random.seed(42)
print(np.random.rand(3))  # 输出: [0.37454012 0.95071431 0.73199394]

二、ndarray数组的属性

Numpy中最重要的一个特点就是其拥有N维数组对象ndarray,它是一系列同类型数据的集合,以下标0开始的进行集合中元素的索引。

1.ndarray的内部组成

一个指向数据(内存或内存映射文件中的一块数据)的指针。

数据类型或dtype,描述在数组中的固定大小值的格子。

一个表示数组形状(shape)的元组,表示各维度大小的元组。

2.ndarray重要的对象属性

①ndarray.ndim: 返回一个整数,表示数组的维度数。

import numpy as np

# 一维数组
arr1 = np.array([1, 2, 3, 4])
print(arr1.ndim)  # 输出: 1

# 二维数组
arr2 = np.array([[1, 2], [3, 4]])
print(arr2.ndim)  # 输出: 2

②ndarray.shape: 用于表示数组的维度信息。shape 返回一个元组,其中包含每个维度的大小(即每个轴上的元素数量)。

import numpy as np

# 一维数组
arr1 = np.array([1, 2, 3, 4])
print(arr1.shape)  # 输出: (4,)

# 二维数组
arr2 = np.array([[1, 2], [3, 4]])
print(arr2.shape)  # 输出: (2, 2)

③ndarray.size:用于返回数组中所有元素的总数。

import numpy as np

# 一维数组
arr1 = np.array([1, 2, 3, 4])
print(arr1.size)  # 输出: 4

# 二维数组
arr2 = np.array([[1, 2], [3, 4]])
print(arr2.size)  # 输出: 4

④ndarray.dtype:返回数组中元素的数据类型,可能是 NumPy 支持的各种数据类型之一,如 int32、float64、bool、str 等。

import numpy as np

# 整数数组
arr1 = np.array([1, 2, 3, 4])
print(arr1.dtype)  # 输出: int64 或 int32(取决于系统)

# 浮点数组
arr2 = np.array([1.0, 2.0, 3.0, 4.0])
print(arr2.dtype)  # 输出: float64

# 布尔数组
arr3 = np.array([True, False, True])
print(arr3.dtype)  # 输出: bool

# 字符串数组
arr4 = np.array(['a', 'b', 'c'])
print(arr4.dtype)  # 输出: <U1(表示Unicode字符,每个字符占用1个单位的空间)

# 指定数据类型
arr5 = np.array([1, 2, 3, 4], dtype=np.float32)
print(arr5.dtype)  # 输出: float32

⑤ndarray.itemsize:表示数组中每个元素所占用的字节数。

import numpy as np

# 整数数组
arr1 = np.array([1, 2, 3, 4])
print(arr1.itemsize)  # 输出: 8(假设是 64 位系统上,int64 类型)

# 浮点数组
arr2 = np.array([1.0, 2.0, 3.0, 4.0])
print(arr2.itemsize)  # 输出: 8(float64 类型)

# 布尔数组
arr3 = np.array([True, False, True])
print(arr3.itemsize)  # 输出: 1(布尔类型通常占用 1 个字节)

# 指定数据类型
arr4 = np.array([1, 2, 3, 4], dtype=np.float32)
print(arr4.itemsize)  # 输出: 4(float32 类型)

# 计算数组的总内存
total_memory = arr4.size * arr4.itemsize
print(total_memory)  # 输出: 16(4 个元素,每个元素占 4 个字节)

⑥ndarray.flags:提供了数组的内存布局和操作的一些信息。它是一个 numpy.flagsobj 对象,包含多个布尔标志,描述了数组的内存分布、是否可写等属性。

import numpy as np

# 创建一个 C 连续的二维数组
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr1.flags)

# 创建一个 F 连续的二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]], order='F')
print(arr2.flags)

# 创建一个数组的视图
arr3 = arr1[0:1]
print(arr3.flags)

# 修改原始数组的可写性
arr1.flags.writeable = False
print(arr1.flags)

三、ndarray的其他创建方式

ndarray数组除了可以使用底层ndarray构造器来创建外,也可以通过以下几种方式来创建。

1.zeros

import numpy as np
np.zeros(shape,dtype=float,order='C')

numpy.zeros()函数创建指定大小和形状的数组,数组元素以0来填充。shape参数用来指定数组大小和形状,dtype参数用来指定元素的数据类型,order参数用来控制数组元素在内存中的存储顺序。

代码示例如下:

import numpy as np

# 生成一个 2 * 3 的数组,元素全为0
arr = np.zeros((2, 3), dtype=float)
print(arr)
"""[[0. 0. 0.]
    [0. 0. 0.]]
"""

2.zeros_like

​import numpy as np
np.zeros_like(a, dtype=None, order='K')

numpy.zeros_like()函数正如它的名字一样,可以生成一个与原数组同样大小充满0的数组。order参数"K"是指保持原有顺序。

代码示例如下:

import numpy as np

arr = np.array([[1, 2, 3], [1, 2, 3]])
# 生成与原数组相同结构,元素全为0的数组
res = np.zeros_like(arr)
print(res)
"""[[0 0 0]
    [0 0 0]]
"""

3.empty

import numpy as np
np.empty(shape, dtype=float, order='C')

numpy.empty()函数与zeros的效果几乎一样,唯一的区别就是在于empty创建完数组后,系统会开辟一个数组空间,数组中的元素是根据内存分配的,效率要比zeros高上许多。

代码示例如下:

import numpy as np

# 生成一个 2 * 4 大小的数组,元素是根据内存分配的
arr = np.empty((2, 4))
print(arr)
"""[[0.    0.03  0.215 0.4  ]
    [0.586 0.77  0.954 1.   ]]
"""

4.linspace

import numpy as np
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

numpy.linspace()函数用于创建一个一维数组,数组是一个等差数列构成的。参数效果可见下图:

代码示例如下:

import numpy as np

# 生成范围为[0,10],样本容量为5,元素类型为float,显示间距的数组
arr = np.linspace(0, 10, 5, True, True, float)
print(arr)  # (array([ 0. ,  2.5,  5. ,  7.5, 10. ]), np.float64(2.5))

5.logspace

import numpy as np
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0)

numpy.logspace()函数用于创建一个一维数组,数组是一个等比数列构成的。参数与linscape很相似,只有base参数与之不同。logspace中的start与stop都是以base为对数的底进行计算的。例如,start = 1 表示为 base ^ 1

代码示例如下:

import numpy as np

# 生成范围为[2^0,2^6],样本容量为5,元素类型为float的数组
arr = np.logspace(0, 6, 5, True, 2, float)
print(arr)  # [ 1.          2.82842712  8.         22.627417   64.        ]

总结

本篇文章,带大家一起了解了Numpy中随机数的生成,ndarray数组的属性以及ndarray数组的多种创建方式。希望可以对大家起到帮助,谢谢。

关注我,内容持续更新(后续内容在作者专栏《从零基础到AI算法工程师》)!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值