Arrays 是 Scipy 的 核心数据类型( Numpy 是 Scipy 的子集, 可以以同样的方式来访问数组对象。所以,这里将一致使用 Scipy 来介绍如何操作 数组对象)。严格来讲,数组对象的类型是 ndarray , 即 n-dimentional array 。通过 引入 scipy 模块,便可操作访问 数组对象。数组对象 类似与 Python Lists , 不同的是,数组对象是多维的数组,支持简洁有效的数组级别的操作。
数据结构图
>>> import scipy
利用 scipy.array(alist) 构建多维数组
```
a = scipy.array([[1, 2, 3], [4, 5, 6]]) # 构建 2 * 3 数组
array([[1, 2, 3],[4, 5, 6]])b = scipy.array([i * i for i in range(10) if i % 2 == 1]) # 构建 1 * 10 的随机数组请查看
array([ 1, 9, 25, 49, 81])c = b.tolist() # 转换成 python list
[1, 9, 25, 49, 81]
```
通过 scipy.zeros(shape, dtype=float) 构建数组对象
返回 一个 shape 指定的 数组,并填充值 0 到所有元素。
```
a = scipy.zeros(100) # 构建 1 * 100 数组
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])b = scipy.zeros((2, 8), int) # 构建 2 * 8 数组
array([[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0]])c = scipy.zeros((2, 2, 2), int) # 构建 2 * 2 * 2 数组
array(
[
[
[0, 0],
[0, 0]
],
[
[0, 0],
[0, 0]
]
]
)
```
通过 scipy.ones(shape, dtype=float) 构建数组对象
返回 一个 shape 指定的 数组,并填充值 1 到所有元素。
```
scipy.ones(5) # 构建 1 * 5 的数组, 并填充 1. 到数组中
array([ 1., 1., 1., 1., 1.])scipy.ones(10, int) # 构建 1 * 10 的数组, 并填充 1 到数组中
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])scipy.pi * scipy.ones((5, 5)) # 构建 5 * 5 的数组, 并填充 pi 到数组中
array([[ 3.14159265, 3.14159265, 3.14159265, 3.14159265, 3.14159265],
[ 3.14159265, 3.14159265, 3.14159265, 3.14159265, 3.14159265],
[ 3.14159265, 3.14159265, 3.14159265, 3.14159265, 3.14159265],
[ 3.14159265, 3.14159265, 3.14159265, 3.14159265, 3.14159265],
[ 3.14159265, 3.14159265, 3.14159265, 3.14159265, 3.14159265]])
通过 scipy.eye(N, M=None, k-0, dtype=float) 构建数组对象
返回一个 2-D(二维) 数组, k 对角线上是 1 , 其他元素都是 0, M 默认是 N
```
scipy.eye(5, 5, 1, int)
array([[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]])scipy.eye(10, 10, 1, int) + scipy.eye(10, 10, -1, int)
array([[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0]])
```
通过 scipe.transpose(a) 构建数组
返回一个 指定 数组的 转置 数组
>>> a = scipy.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]) >>> scipy.transpose(a) array([[ 1, 6], [ 2, 7], [ 3, 8], [ 4, 9], [ 5, 10]]) >>> a.T # 等价于 scipy.transpose(a) array([[ 1, 6], [ 2, 7], [ 3, 8], [ 4, 9], [ 5, 10]])
通过 scipy.arange(start, stop, increment) 构建数组对象
返回 1 * N 维数组, 其值的生成 等同于 Python range 函数
>>> scipy.arange(3) array([0, 1, 2]) >>> scipy.arange(1, 10, 2) array([1, 3, 5, 7, 9])
通过 scipy.linspace(start, stop, num_elements) 构建数组对象
通过 scipy.random 随机数组构造器 构建数组对象
>>> scipy.random.random((5, 5)) # 5 * 5 数组, 每个元素的值是 [0., 1.)的随机数 array([[ 0.54835728, 0.68842299, 0.27092076, 0.97736089, 0.70871043], [ 0.75544761, 0.68802281, 0.67291087, 0.27854031, 0.48492923], [ 0.48325973, 0.9010961, 0.84767 , 0.94258563, 0.99792361], [ 0.27465145, 0.61586656, 0.59351729, 0.73674333, 0.80784786], [ 0.08397848, 0.77584239, 0.65946262, 0.11980866, 0.47662084]]) >>> scipy.random.randint(0, 10, (5, 5)) # 5 * 5 数组,每个元素的值是 [ 0 , 10 )的随机数 array([[8, 3, 0, 3, 3], [5, 9, 9, 8, 7], [2, 0, 0, 5, 4], [2, 6, 2, 3, 3], [8, 8, 8, 5, 5]])
多维数组 索引
>>> a = scipy.random.randint(1, 10, (5, 5, 5)) array([[[7, 4, 5, 7, 2], [7, 9, 5, 4, 1], [2, 8, 5, 6, 4], [4, 5, 3, 3, 1], [8, 6, 9, 9, 2]], [[3, 7, 3, 4, 7], [1, 7, 1, 2, 1], [3, 9, 4, 9, 1], [7, 6, 7, 9, 6], [4, 5, 6, 8, 4]], [[2, 1, 8, 9, 4], [1, 7, 9, 3, 3], [8, 6, 1, 6, 7], [1, 2, 7, 5, 5], [9, 9, 5, 7, 8]], [[6, 6, 7, 4, 8], [3, 4, 3, 1, 1], [5, 8, 1, 4, 6], [2, 9, 8, 1, 7], [9, 7, 4, 1, 1]], [[4, 9, 7, 6, 6], [9, 8, 5, 2, 7], [3, 7, 3, 1, 3], [2, 9, 6, 1, 4], [3, 3, 7, 1, 8]]]) >>> a[1, 3, 4] 7
反向索引
>>> a = scipy.random.randint(1, 10, (5, 5)) array([[7, 9, 1, 8, 3], [8, 4, 1, 4, 1], [9, 7, 5, 1, 2], [7, 4, 7, 3, 9], [7, 7, 6, 3, 8]]) >>> a[-1, -2] 3
``` >>> a = scipy.random.randint(1, 10, (5, 5)) array([[2, 9, 2, 6, 4], [3, 4, 3, 7, 5], [8, 6, 4, 1, 3], [5, 9, 2, 3, 5], [7, 9, 4, 2, 7]]) >>> a[1:3, 2:4] array([[3, 7], [4, 1]]) >>> a[:3, 2:] array([[2, 6, 4], [3, 7, 5], [4, 1, 3]]) ```
>>> a = scipy.ones((3, 3), int) >>> b = 2 * scipy.ones((3, 3), int) >>> a + b array([[3, 3, 3], [3, 3, 3], [3, 3, 3]]) >>> a * b array([[2, 2, 2], [2, 2, 2], [2, 2, 2]]) >>> c = scipy.random.randint(1, 10, (3, 3)) array([[3, 6, 4], [6, 2, 8], [2, 1, 9]]) >>> b * c array([[ 4, 4, 2], [18, 14, 6], [16, 6, 2]])
>>> a = scipy.ones((3, 3)) >>> scipy.sin(a) array([[ 0.84147098, 0.84147098, 0.84147098], [ 0.84147098, 0.84147098, 0.84147098], [ 0.84147098, 0.84147098, 0.84147098]]) >>> scipy.cos(a) array([[ 0.54030231, 0.54030231, 0.54030231], [ 0.54030231, 0.54030231, 0.54030231], [ 0.54030231, 0.54030231, 0.54030231]])
简单的求和
>>> a = scipy.random.randint(1, 10, (3, 3)) array([[3, 6, 4], [6, 2, 8], [2, 1, 9]]) >>> scipy.sum(a) # 返回所有元素的和 36 >> scipy.sum(a, 0) # 按照 axis = 0 (参考数据结构图) 的 求和 array([19, 9, 21]) >>> scipy.sum(a, 1) # 按照 axis = 1 (参考数据结构图) 的 求和 array([13, 16, 12])
平均值
>>> a = scipy.random.randint(1, 10, (3, 3)) array([[9, 4, 5], [2, 4, 5], [3, 4, 3]]) >>> scipy.mean(a, 0) # 求平均值 array([ 4.66666667, 4. , 4.33333333]) >>> scipy.std(a, 0) # 求标准差 array([ 3.09120617, 0. , 0.94280904])
累加
>>> a = scipy.random.randint(1, 10, (3, 3)) array([[9, 4, 5], [2, 4, 5], [3, 4, 3]]) >>> scipy.cumsum(a, 0) # 按照 axis = 0 累加 array([[ 9, 4, 5], [11, 8, 10], [14, 12, 13]]) >>> scipy.cumsum(a) array([ 9, 13, 18, 20, 24, 29, 32, 36, 39])
感谢 knightdf 的指正,以下为对本文的修正:
修正内容一:
>>> a = scipy.array([[1, 2, 3], [4, 5, 6]]) # 构建 2 * 3 数组 array([[1, 2, 3],[4, 5, 6]]) >>> b = scipy.array([i * i for i in range(10) if i % 2 == 1]) # # 构建 1 * 5 的数组,且每项为 10 以内 被 2 除 模为 1 的数的平方。 array([ 1, 9, 25, 49, 81]) >>> c = b.tolist() # 转换成 python list [1, 9, 25, 49, 81]
返回 一个 shape 指定的 数组,并填充值 0 到所有元素。
>>> a = scipy.zeros(100) # 构建 1 * 100 数组 array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) >>> b = scipy.zeros((2, 8), int) # 构建 2 * 8 数组 array([[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]) >>> c = scipy.zeros((2, 2, 2), int) # 构建 2 * 2 * 2 数组 array([[[0, 0], [0, 0]], [[0, 0], [0, 0]]])
返回 一个 shape 指定的 数组,并填充值 1 到所有元素。
>>> scipy.ones(5) # 构建 1 * 5 的数组, 并填充 1. 到数组中 array([ 1., 1., 1., 1., 1.]) >>> scipy.ones(10, int) # 构建 1 * 10 的数组, 并填充 1 到数组中 array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) >>> scipy.pi * scipy.ones((5, 5)) # 构建 5 * 5 的数组, 并填充 pi 到数组中 array([[ 3.14159265, 3.14159265, 3.14159265, 3.14159265, 3.14159265], [ 3.14159265, 3.14159265, 3.14159265, 3.14159265, 3.14159265], [ 3.14159265, 3.14159265, 3.14159265, 3.14159265, 3.14159265], [ 3.14159265, 3.14159265, 3.14159265, 3.14159265, 3.14159265], [ 3.14159265, 3.14159265, 3.14159265, 3.14159265, 3.14159265]])
修正内容二:
>>> a = scipy.random.randint(1, 10, (3, 3)) array([[3, 6, 4], [6, 2, 8], [2, 1, 9]]) >>> scipy.sum(a) # 返回所有元素的和 36 >> scipy.sum(a, 0) # 按照 axis = 0 (参考数据结构图) 的 求和 array([11, 9, 21]) >>> scipy.sum(a, 1) # 按照 axis = 1 (参考数据结构图) 的 求和 array([13, 16, 12])
![]() | 1 knightdf 2016-03-02 19:37:48 +08:00 ![]() b = scipy.array([i * i for i in range(10) if i % 2 == 1]) # 构建 1 * 10 |
2 bboyliu OP ![]() @knightdf 第一次在 V2EX 上发文章,不能修改,另外,文章还有很多地方排版都不好,没办法修改了。*** 依旧谢谢你的指正 ***!!! 针对你发的代码,正确的描述为: ``` # 构建 1 * 5 的数组,且每项为 10 以内 被 2 除 模为 1 的数的平方。 b = scipy.array([i * i for i in range(10) if i % 2 == 1]) ``` |
![]() | 3 knightdf 2016-03-02 21:00:51 +08:00 ![]() |
![]() | 4 Kilerd 2016-03-02 22:08:02 +08:00 没有养成发文章之前先预览的好习惯(并不是特指在 V2 ) |