在不同的领域,所需要的数组往往是不同的。有的需要全0数组,有的需要满足正态分布的数组,接下来我们就来学习如何使用numpy生成各种各样的数组。
1. 生成0和1的数组
1.1 应用场景
在图像处理中,我们通常是借助矩阵来表示图片的颜色,全 0 数组表示黑色,全 1 数组表示白色。
在数据处理过程中,有时也需要借助全 0 或全 1 数组表示边界条件和权重。
1.2 使用zeros方法创建全0数组
代码示例:
import numpy as np
zeroArray = np.zeros((2, 4))
print(zeroArray)
输出结果:
[[0. 0. 0. 0.]
[0. 0. 0. 0.]]
通过zeros方法创建全0数组,需要传入的是想要创建的全零数组的形状(shape属性)。
1.3 使用ones方法创建全1数组
代码示例:
import numpy as np
oneArray = np.ones((3, 4))
print(oneArray)
输出结果:
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
和zeros方法一样,创建全1数组,传入的参数是想要创建的全1数组的形状(shape属性)。
不管是0填充还是1填充,默认的数据类型都是浮点数,可以通过在参数中传入dtype的值来修改数据类型,需要注意这一点。
2. empty方法创建未初始化数组
2.1 应用场景
empty方法创建出来的数组是一个指定了数组的形状、数据类型但是未初始化的数组,也就是里面的数据没有填充值。
在实验中,有时我们还并未知晓实验数据,但需要提前分配一个三行四列的地址空间,就可以创建一个未初始化的数组来使用。
2.2 示例
代码示例:
import numpy as np
emptyArray = np.empty((3, 4))
print(emptyArray)
输出结果:
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
之前不是说没有填充值吗?为什么这里又会出现值呢?这其实不难理解,未初始化并不代表没有值,为了程序的安全,未初始化的变量程序会根据编译器的设置填充一些值,比如这里的全0值。
3. eye方法创建对角数组
3.1 应用场景
线性代数中的对角矩阵,有着特殊的性质,能够简化计算,所以在计算中用到很多。
3.2 示例
代码示例:
import numpy as np
eyeArray = np.eye(4)
print(eyeArray)
输出结果:
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
通过eye方法创建对角数组,需要传入的参数是想要生成的对角数组的维度。
4. 从现有数组中生成新数组
利用现有数组生成新数组的方式有三种:array方法
、asarray方法
、copy方法
。
4.1 array方法
方法:numpy.array(object, dtype, shape)
- object是想要转成numpy数组的数据对象,可以为python中的列表、元组或者数组
- dtype为转换之后的数组的数据类型,不设置就与原对象的数据类型一样
- shape用于指定数组的形状,若不设置则与原数据对象的 shape 相同
代码示例:
import numpy as np
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1)
输出结果:
[1 2 3 4 5]
4.2 asarray方法
方法:numpy.asarray(object, dtype)
- object是想要转成numpy数组的数据对象,可以为python中的列表、元组或者数组
- dtype为转换之后的数组的数据类型,不设置就与原对象的数据类型一样
代码示例:
import numpy as np
arr1 = np.asarray([1, 2, 3, 4, 5])
print(arr1)
输出结果:
[1 2 3 4 5]
4.3 copy方法
方法:numpy.copy(object)
- object 为要创建副本的数据对象,可以为列表、元组或者数组。
代码示例:
import numpy as np
arr1 = np.array([1, 2, 3, 4, 5])
arr4 = np.copy(arr1)
print(arr4)
输出结果:
[1 2 3 4 5]
4.4 三种方法的不同
通过以上三种方法,我们发现array
asarray
copy
生成新数组的操作基本是相同的,那么它们之间有什么不同呢?
思考一下,当我们用原数组生成新数组后,对原数组进行修改新数组是否会改变呢?
代码示例:
import numpy as np
# 初始数组
array1 = np.array([1, 2, 3, 4, 5])
# array方法
array2 = np.array(array1)
# asarray方法
array3 = np.asarray(array1)
# copy方法
array4 = np.copy(array1)
# 修改初始数组
array1[0] = 10
print(array1)
print(array2)
print(array3)
print(array4)
输出结果:
[10 2 3 4 5]
[1 2 3 4 5]
[10 2 3 4 5]
[1 2 3 4 5]
我们发现,除了初始数组改变了,通过asarray方法
创建的array3同时也改变了。
由此,我们知道:array 和 copy 方法生成的是原数组的副本,是对原数组进行的深拷贝,新数组的内存地址与原数组是不同的;asarray 是对原数组进行的浅拷贝,它是原数组的视图,新数组的内存地址与原数组的内存地址是相同的。
5. 生成固定范围的数组
生成固定范围的数组方法主要有两种:linspace方法
和arange方法
。
5.1 linspace方法
方法:numpy.linspace(start, stop, num)
- start 为数据的起始点
- stop 为数据的结束点
- num 为等步长生成的数据量
代码示例:
import numpy as np
arr = np.linspace(0, 100, 5)
print(arr)
输出结果:
[ 0. 25. 50. 75. 100.]
可以看见,我们成功得到了一个数据量为 5 的等距数组,默认数据类型为浮点型。同时,我们可以看见生成的数组是包括了我们设置的数据范围的边界的,我们可以简记为“左闭右闭
”原则。在数学上,如果我们需要生成一定范围内的指定数据量的等距数组时便可以通过该方法获取。
5.2 arange方法
方法:arange(start, stop, step)
- start 为数据起始点
- stop 为数据终点
- step 为数据之间的步长,默认为 1
代码示例:
import numpy as np
arr = np.arange(0, 100, 5)
print(arr)
输出结果:
[ 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95]
该方法生成的数据类型默认是整型,并且范围不包括右边界,可以简记为“左闭右开
”原则。
6. 生成随机数组
通过numpy生成随机数组,随机嘛,那就需要借助到numpy中集成的random模块来使用了。
6.1 应用场景
在角色扮演游戏中,我们可以使用随机数组生成随机的战斗伤害、经验值或掉落物品,以增加游戏的趣味性和可玩性。
在电路模拟中,我们可以使用随机数组生成随机的噪声信号,以评估电路的性能和稳定性。
6.2 均匀分布随机数组
生成均匀分布随机数组主要有 rand
方法和 uniform
两种方法。
6.2.1 rand方法
方法:rand(shape, dtype)
- shape 为数组的形状
- dtype 为数组的数据类型,默认为浮点型
代码示例:
import numpy as np
arr = np.random.rand(3, 2)
print(arr)
输出结果:
[0.42815375 0.66891408 0.06805597]
通过这种方法生成的随机数组的缺点是只能在0-1范围内。
6.2.2 uniform方法
uniform 方法用于生成指定范围内的均匀分布的数组,相较于 rand 方法更为灵活。
方法:uniform(low, high, size)
- size 为数组的形状
- low 为随机数的最小值
- high 为随机数的最大值
示例代码:
import numpy as np
arr = np.random.uniform(-100, 100, (2, 3))
print(arr)
输出结果:
[[ -3.23066347 37.18155823 51.38467176]
[ 48.69619507 -50.52687747 -60.2886281 ]]
6.3 正态分布随机数组
生成正态分布数组的方法组要有两种,分别为 normal
方法和 standard_normal
方法。
6.3.1 normal方法
方法:normal(loc, scale, size)
- loc 为正态分布数组的均值
- scale 为数组的方差
- 通过 size 属性我们能够设置数组的形状或者数据量
代码示例:
import numpy as np
# 生成一个均值为60,方差为80,数据量为20的数组
arr = np.random.normal(60, 80, 20)
print(arr)
输出结果:
[ 17.56620883 39.26466826 9.53503476 -20.0436556 -36.0770559
24.96066473 -11.53607856 -95.40051648 116.65556515 42.8829583
135.80142085 16.44173694 36.77476371 -49.79408559 -74.77626063
112.03888778 40.10808176 7.39057851 72.23707501 46.91105252]
6.3.2 standard_normal方法
利用 standard_normal 方法用于生成指定形状的符合标准正态分布的数组,该方法与 normal 方法相比不是很灵活。
应用场景:在机器学习中,生成一组符合标准正态分布的数组可以用于初始化模型的参数,特别是对于需要随机初始化的算法,例如随机梯度下降等。通过将参数初始化为标准正态分布,可以帮助模型更好地收敛到最优解,并提高模型的性能和准确性。
方法:standard_normal(size)
- 其中 size 为随机数组的形状
代码示例:
import numpy as np
arr = np.random.standard_normal((3, 4))
print(arr)
输出结果:
[[ 0.36223695 1.79655214 0.93572268 -0.39002862]
[ 1.46796161 -0.44343536 -1.09964203 1.48888228]
[-0.38504658 0.566783 1.48473116 0.62476208]]
7. 总结
本文主要介绍了如何使用numpy生成各种各样的数组:
- 在图片处理等领域,我们可以利用 zeros 和 ones 函数生成全 1 或全 0 数组来代表黑色图片以及白色图片。在处理一些物理问题时,往往需要借助一些特殊的矩阵,这时我们可以借助 eye 方法生成符合要求的对角矩阵。当我们需要为数据预先分配内存时,可以借助 empty 生成空数组,对内存空间进行预分配。
- 利用已有数组生成新数组时,array 和 copy 方法生成的是原数组的副本,是对原数组进行的深拷贝,新数组的内存地址与原数组是不同的;asarray 是对原数组进行的浅拷贝,它是原数组的视图,新数组的内存地址与原数组的内存地址是相同的。
- 如果想要生成指定个数的等距数组,我们可以使用 linspace 方法,要注意该方法生成的数组是包括边界值的;如果想要设置数据之间的步长,我们可以借助 arange 方法,该方法生成的数组是不包括边界值的。
- 在处理概率论问题时,如果想要生成均匀分布的数组,我推荐大家使用 uniform 方法,该方法能够指定数据范围,使用起来相对灵活;如果想要生成符合正态分布的数组,我推荐大家使用 normal 方法,利用该方法我们能够指定数组的方差和均值,使用起来也比较灵活,既可以生成符合标准正态分布的数组,也可以生成符合其他类型的正态分布的数组。
到这里,如何利用numpy生成各种各样的数组我们就介绍完了。作者:张小yu