初识 Python 科学计算库之 NumPy(创建多维数组对象)

参考

项目描述
菜鸟教程NumPy 教程
NumPyAPI reference
利用 Python 进行数据分析韦斯·麦金尼 / 徐敬一 译
搜索引擎Bing

描述

项目描述
Jupyter Notebook6.5.2
Python3.9.13

NumPy

Numpy

NumPy(Numerical Python) 是一个开源的 Python 第三方库,几乎用于每个科学和工程领域。
NumPy 与 SciPy、Matplotlib、SciKits 等其他众多 Python 科学计算库很好的结合在一起,共同构建了一个完整的科学计算生态系统。

特点

  1. NumPy 支持广泛的硬件及计算平台,并且可以很好地使用分布式、 GPU 和稀疏数组库。

  2. NumPy 可以同时针对整个数组中的每个元素进行复杂计算而不需要使用到 Python 循环。

  3. NumPy 在内部将数据存储在连续的内存空间中(有利于提高数据的处理速度),这与 Python 中的其他序列结构的存储方式是不同的。

  4. 存储相同的数据,NumPy 使用的内存量小于 Python 中的其他序列结构。

  5. NumPy 的多维数组对象仅支持相同数据类型的数据,因此,NumPy 并不适合用于科学计算之外的领域。

  6. NumPy 的大部分代码是通过 C 语言进行编写的,这使得 NumPy 对数据的处理十分高效。

获取

若你的计算机已经安装了 Python 的包管理器 PIP(Package Installer for Python),那么你可以通过如下命令来对 NumPy 进行下载安装。

pip install numpy

导入

如果你需要在 Python 中使用 NumPy,请以这样的方式对其进行导入:

import numpy as np

多维数组对象

NumPy 定义了一个 n 维数组对象,简称 ndarray(N Dimensional Array) 对象,它是一个一系列相同数据类型的元素组成的集合,数组中的每个元素均占有大小相同的内存块。

np.array()

np.array() 可以将 Python 内置的序列对象转换为多维数组对象。

np.array(object, dtype = None, ndmin = 0)

其中:

项目描述
object需要转换为多维数组对象的 Python 内置对象。
dtye多维数组对象中的元素的数据类型。
ndmin规定多维数组的最低维度。

注:

请不要试图使用 np.array() 将数组及列表以外的 Python 内置结构转换为多维数组对象。如果需要这样做,请先将该数据结构转换为列表或元组。
虽然使用 np.array() 能够将数组及列表以外的 Python 内置结构转换为多维数组对象,但这样做并没有什么意义(多数情况下,np.array() 会将这类数据结构转换为包含单个该数据结构的一维数组)。

import numpy as np

arr = np.array({1, 3, 6})
print(arr)
print(type(arr))

打印结果:

{1, 3, 6}
<class ‘numpy.ndarray’>

错误

如果你试图对创建的数组进行运算,Python 将抛出错误信息,因为使用 np.array() 将集合转换为多维数组对象的结果是包含一个集合的一维数组对象。

import numpy as np

arr = np.array((1, 3, 6)) 
print(arr)
print(arr + 1)

print('---------------------------')

arr1 = np.array({1, 3, 6})
print(arr1)
print(arr1 + 1)

打印结果:

[1 3 6]
[2 4 7]
---------------------------
{1, 3, 6}

错误信息:

错误信息

np.asarray()

与 np.array() 类似的函数还有 np.asarray(),该函数与 np.arrary() 的功能类似,但该函数所支持的参数相比 np.arrary() 更少。

np.asarray(a, dtype=None)

其中:

a 为需要转换为多维数组对象的序列对象(列表或元组)。

范围

使用 np.arange() 创建多维数组对象,我们可以达到与 Python 内建函数 range() 函数类似的效果。

np.arange([start, ]stop, [step, ]dtype=None)

其中:

项目描述
start起始值。
stop中止值。生成的多维数组对象中不包含中止值。
step步长。
dtype多维数组对象中的元素的数据类型。

举个栗子

import numpy as np

arr = np.arange(3, 37, 3)
print(arr)

打印结果:

[ 3  6  9 12 15 18 21 24 27 30 33 36]

注:

  1. 与 Python 中的内置函数 range() 不同,Numpy 中的 arange() 函数的步长可以为任意数,而 range() 函数中的步长仅能为整数。
  2. arange() 函数的元素可以为浮点数,这意味着你可以使用浮点数作为 startstop 参数的值。

随机

概览

NumPy 中提供了如下函数来生成包含随机数的多维数组对象(部分):

项目描述
np.random.randn()使用 np.random.randn() 函数你将从 均值为 0 方差为 1 的样本 中抽取指定数量的元素组成指定形状的多维数组对象。
np.random.normal()使用 np.random.normal() 函数可以从指定正态分布样本中抽取指定数量的数据以创建指定形状的多维数组对象。
np.random.choice()使用 np.random.choice() 函数可以从指定的 一维序列 中抽取指定数量的数据以创建指定形状的多维数组对象。
np.random.random()使用 np.random.random() 函数可以从 [0, 1) 的样本中抽取指定数量的数值用以创建指定形状的多维数组对象。
np.random.randint()你可以通过使用 np.random.randint() 从指定的范围的整数样本中抽取一定数量的数据以创建指定形状的多维数组对象。
np.random.shuffle()使用 np.random.shuflle() 函数能将传递给该函数的序列打乱顺序并创建相应的多维数组对象。
np.random.seed()你可以通过向 np.random.seed() 函数传递数值来设定使用的随机数种子。

np.random.randn()

使用 np.random.randn() 函数你将从 均值为 0 方差为 1 的样本 中抽取指定数量的元素组成指定形状的多维数组对象。

举个栗子

import numpy as np

arr = np.random.randn(2, 3, 3)
print(arr)

打印结果

[[[-0.0480595   0.56356363 -0.21505354]
  [ 0.44823873 -1.11214077 -0.52324077]
  [-0.19093371  0.05920201 -2.22010313]]

 [[ 1.06321783 -0.17210113  0.65355918]
  [-0.65389436 -0.76957588  1.17436737]
  [ 1.06294231  0.79249734  0.1901463 ]]]

注:

当你没有提交实参给 np.random.randn() 函数时,该函数将返回仅包含一个元素(从 均值为 0 方差为 1 的样本 中抽取)的数组。

np.random.normal()

使用 np.random.normal() 函数可以从指定正态分布样本中抽取指定数量的数据以创建指定形状的多维数组对象。

np.random.normal(loc=0.0, scale=1.0, size=None)

其中:

项目描述
loc用于指定正态分布的期望值。
scale用于指定正态分布的标准差。
size用于指定生成的多维数组对象的形状,省略该参数将获得包含一个从指定正态分布样本中抽取的数据的多维数组对象。

举个栗子

import numpy as np

arr = np.random.normal(loc=0, scale=2, size=(2, 3))
print(arr)

打印结果:

[[ 1.01480683  4.4998025   5.78320235]
 [-1.22391397 -0.26704833  2.15595718]]

注:

np.random.normal() 函数中的参数 loc 为零,scale1 时,该函数产生的数据与 np.random.randn() 来自于同一样本。

np.random.choice()

使用 np.random.choice() 函数可以从指定的 一维序列 中抽取指定数量的数据以创建指定形状的多维数组对象。

np.random.choice(a, size=None, p=None)

其中:

项目描述
a指定一个一维序列作为样本。当你使用数值作为该形参对应的实参时,将自动使用 np.arange() (将数值作为该函数的参数)创建多维数组对象。
size指定创建的多维数组对象的形状。
p你可以通过该参数提供一个与样本相同长度的一维序列,该序列中的元素将与样本中的同位置元素一一对应,作为样本中对应元素被抽取到的概率。概率之和需要为 1,否则将抛出错误。

举个栗子

import numpy as np

arr = [1, 2, 3, 4]
result = np.random.choice(arr, size=(8, 8), p=[0.1, 0.1, 0.7, 0.1])
print(result)

打印结果:

[[1 1 3 2 3 3 3 2]
 [3 3 3 3 3 3 1 4]
 [3 4 1 3 4 3 4 3]
 [3 3 3 3 2 3 3 3]
 [2 3 3 3 1 1 2 4]
 [3 3 1 3 3 3 3 3]
 [3 3 3 3 1 3 3 2]
 [3 3 4 3 3 2 2 3]]

np.random.random()

使用 np.random.random() 函数可以从 [0, 1) 的样本中抽取指定数量的数值用以创建指定形状的多维数组对象。

np.random.random(size=None)

举个栗子

import numpy as np

result = np.random.random((1, 2))
print(result)

打印结果:

[[0.52577711 0.36884136]]

注:

  1. np.random.rand()np.random.random() 函数的效果是相同的,不同的是两者所接受的参数的形式。np.random.rand() 接受多个参数用以表示生成的数组的形状,而 np.random.random() 函数则仅能接受一个参数(元组)用以表示生成的数组的形状。
  2. np.random.rand()np.random.random() 的区别通过网络的了解似乎只是在参数上有所不同,这样做的目的是为了更好的服务来自于 Matlab 等平台的用户。我们可以通过指定随机数种子来判断两个函数的实现是否是相同的(相同的实现遇到同一随机种子总是会生成相同的随机数数值)。对此,请参考如下示例:
import numpy as np


# 设定随机数种子
np.random.rand(3)

arr = np.random.rand(3, 4)
print(arr)

# 分割线
print()
print('---------------++++++++++++++++++++++----------------')
print()

arr1 = np.random.random((3, 4)) 
print(arr)

执行结果

可以看到,两个函数在被指定了随机数种子的情况下生成了相同的数组,这意味着两者的实现是相同的。

[[0.1837531  0.63999441 0.92618798 0.11470242]
 [0.87878324 0.53579286 0.7478178  0.4104945 ]
 [0.91881516 0.30928952 0.9829235  0.22894728]]

---------------++++++++++++++++++++++----------------

[[0.1837531  0.63999441 0.92618798 0.11470242]
 [0.87878324 0.53579286 0.7478178  0.4104945 ]
 [0.91881516 0.30928952 0.9829235  0.22894728]]

np.random.randint()

你可以通过使用 np.random.randint() 从指定的范围的整数样本中抽取一定数量的数据以创建指定形状的多维数组对象。

np.random.randint(low, high=None, size=None, dtype=int)

其中:

项目描述
low指定样本中整数的最小值,可以通过数组进行指定。
high指定样本中整数的最大值(样本中不包含最大值),可以通过数组进行指定。
size指定创建的多维数组对象的形状。
dtype指定多维数组对象中各个元素的数据类型。

如果 high 被省略,则样本数据中的整数范围为 [0, low)

创建一个包含最大整数为 9,最小整数为 3 的 3 * 3 多维数组对象

import numpy as np

result = np.random.randint(3, 10, size=(3, 3))
print(result)

打印结果:

[[5 7 4]
 [9 5 8]
 [8 8 9]]

创建一个包含最小整数分别为 2、3、4,最大整数分别为 7、8、9 的多维数组对象

import numpy as np

result = np.random.randint([2, 3, 4], [8, 9, 10])
print(result)

打印结果:

[3 8 7]

注:

如果最小值与最大值是多对多的情况,则提交给 np.random.randint() 函数的最小值与最大值相关的序列中的元素需要相同,否则 Python 将抛出错误。例如:

import numpy as np

result = np.random.randint([2, 3, 4], [8, 9])
print(result)

抛出错误:

错误信息

创建一个包含最小整数分别为 2、3、4,最大整数分别为 7、8、9 的多维数组对象(指定形状)

import numpy as np

result = np.random.randint([2, 3, 4], [8, 9, 10], size=(4, 2, 3))
print(result)

打印结果:

[[[2 5 4]
  [2 4 7]]

 [[4 5 9]
  [4 8 7]]

 [[5 4 7]
  [7 6 8]]

 [[3 6 6]
  [7 7 5]]]

注:

指定形状时,需要保证创建的多维数组对象中最低维度的数组的列数与传递给lowhigh 参数的数组中列数最多的那一个数组的列数保持一致,否则将抛出错误。例如:

import numpy as np

result = np.random.randint([2, 3, 4], [8, 9, 10], size=(4, 2, 4))
print(result)

抛出错误:

错误信息

创建一个包含最小整数为 2,最大整数分别为 7、8、9 的多维数组对象(指定形状)

import numpy as np

result = np.random.randint(2, [8, 9, 10], size=(4, 2, 3))
print(result)

打印结果:

[[[6 8 7]
  [5 2 9]]

 [[4 8 9]
  [2 4 8]]

 [[7 7 8]
  [6 5 5]]

 [[4 2 2]
  [2 2 9]]]

np.random.shuffle()

使用 np.random.shuflle() 函数能将传递给该函数的序列打乱顺序并创建相应的多维数组对象。

举个栗子

import numpy as np

arr = [1, 3, 6]
result = np.random.shuffle(arr)
print(arr)
print(result)

打印结果:

[3, 6, 1]
None

注:

该函数将会影响到原序列,请小心使用。

np.random.seed()

程序中产生的随机数均为伪随机数,因为这些随机数都是由具有确定性行为的算法根据随机数生成器中的随机数中子生成的。

你可以通过向 np.random.seed() 函数传递数值来设定使用的随机数种子。

举个栗子

import numpy as np

np.random.seed(3)
result = np.random.random((3, 4))
print(result)

多次执行上述代码,你都将获得如下打印结果:

[[0.5507979  0.70814782 0.29090474 0.51082761]
 [0.89294695 0.89629309 0.12558531 0.20724288]
 [0.0514672  0.44080984 0.02987621 0.45683322]]

你也可以不向 np.random.seed() 函数传递数值来取消对随机数种子的指定。

举个栗子

import numpy as np

np.random.seed(3)
np.random.seed()
result = np.random.random((3, 4))
print(result)

多次执行上述代码,你将获得不同的打印结果。

数列

等差数列

你可以使用 numpy.linspace() 函数用于创建一个包含等差数值的一维数组。

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

其中:

项目描述
start等差数列的起始值。
stop等差数列的终止值,如果参数 endpointTrue,则该值将被包含于数列中。
num等差数列中的元素个数。
endpoint该值为 True 时,等差数列中将包含 stop 参数对应的值。
retstep如果该参数的值为 True ,则生成的数组中将会显示间距。
dtype多维数组中各个元素的数据类型。

举个栗子

import numpy as np

arr = np.linspace(1, 36, num=20, retstep=True)
arr1 = np.linspace(1, 36, num=20)
print(arr)
print()
print(arr1)

打印结果:

(array([ 1.        ,  2.84210526,  4.68421053,  6.52631579,  8.36842105,
       10.21052632, 12.05263158, 13.89473684, 15.73684211, 17.57894737,
       19.42105263, 21.26315789, 23.10526316, 24.94736842, 26.78947368,
       28.63157895, 30.47368421, 32.31578947, 34.15789474, 36.        ]), 1.8421052631578947)

[ 1.          2.84210526  4.68421053  6.52631579  8.36842105 10.21052632
 12.05263158 13.89473684 15.73684211 17.57894737 19.42105263 21.26315789
 23.10526316 24.94736842 26.78947368 28.63157895 30.47368421 32.31578947
 34.15789474 36.        ]

等比数列

你可以使用 numpy.linspace() 函数用于创建一个包含等差数值的一维数组。

np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)

其中:

项目描述
start等比数列的起始值为 start ** base
stop等比数列的终止值 stop ** base,如果参数 endpointTrue,则该值将被包含于数列中。
num等比数列中的元素个数。
endpoint该值为 True 时,等比数列中将包含 stop 参数对应的值。
base指定等比数列的公比。
dtype多维数组中各个元素的数据类型。

举个栗子

import numpy as np

arr = np.logspace(1, 10, num=10, base=2)
print(arr)

打印结果:

[   2.    4.    8.   16.   32.   64.  128.  256.  512. 1024.]

填充

np.zeros()

np.zeros() 函数可用于创建指定形状的多维数组,该数组中的元素均为 0

np.zeros(shape, dtype=float)

其中

项目描述
shape用于指定多维数组对象的形状。
dtype用于指定多维数组对象中的元素的数据类型。如果省略该参数,将使用默认值 np.float64

举个栗子

import numpy as np

arr = np.zeros((3, 4))
print(arr)

打印结果:

[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

与 np.zeros() 类似的其他函数

项目描述
np.ones()np.ones() 函数可用于创建指定形状的多维数组,该数组中的元素均为 1

np.zeros_like()

np.zeros_like() 函数可用于创建与指定序列相同形状的多维数组,该数组中的元素均为 0

np.zeros_like(a, dtype=None, shape=None)

举个栗子

import numpy as np

arr = [[1, 2, 3], [4, 5, 6]]
result = np.zeros_like(arr)
print(result)

打印结果:

[[0 0 0]
 [0 0 0]]

注:

当然你也可以通过该函数的 shape 属性来创建指定形状的数组。

import numpy as np

arr = [[1, 2, 3], [4, 5, 6]]
result = np.zeros_like(arr, shape=(2, 2))
print(result)

打印结果:

[[0 0]
 [0 0]]

shape 指定的形状可以与传递给该函数的数组不同。

与 np.zeros_like() 类似的函数

项目描述
np.ones_like()np.ones_like() 函数可用于创建与指定序列相同形状的多维数组,该数组中的元素均为 1

np.full()

np.full() 函数可用于创建指定形状的多维数组,并且你可以指定该数组中的所有元素的值。

np.full(shape, fill_value, dtype=None)

其中:

项目描述
shape用于指定多维数组对象的形状。
fill_value用于指定多维数组中所有元素的值。
dtype指定多维数组中元素的数据类型。

举个栗子

import numpy as np

arr = np.full((3, 6), fill_value=6)
print(arr)

打印结果:

[[6 6 6 6 6 6]
 [6 6 6 6 6 6]
 [6 6 6 6 6 6]]

np.full_like()

np.full_like() 函数可用于创建与指定序列相同形状的多维数组,并且你可以指定该数组中的所有元素的值。

np.full_like(a, fill_value, dtype=None, shape=None)

注:

shape 指定的形状可以与传递给该函数的数组不同。

细节

修改形状

某些函数没有提供设定创建的多维数组对象的形状的参数,但我们可以通过使用 ndarray (即多维数组对象)对象的 reshape() 方法来修改多维数组对象的形状。

举个栗子

import numpy as np

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

打印结果:

[1 2 3 4 5 6]

[[1 2 3]
 [4 5 6]]

注:

ndarray 对象的 reshape() 方法并不会修改原数组,该方法将返回一个新的 ndarray 对象。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BinaryMoon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值