# NumPy快餐教程(2) - 多维数组进阶

## 访问元素

NumPy中使用[]方括号来访问元素。如果是一维数组，就用下标数字，例如a[1]，如果是多维数组，就在方括号中使用元组tuple，例如a[(2,3,4)]

In [1]: import numpy as np

In [2]: a20 = np.linspace(1,100,27)

In [3]: a20
Out[3]:
array([   1.        ,    4.80769231,    8.61538462,   12.42307692,
16.23076923,   20.03846154,   23.84615385,   27.65384615,
31.46153846,   35.26923077,   39.07692308,   42.88461538,
46.69230769,   50.5       ,   54.30769231,   58.11538462,
61.92307692,   65.73076923,   69.53846154,   73.34615385,
77.15384615,   80.96153846,   84.76923077,   88.57692308,
92.38461538,   96.19230769,  100.        ])

In [4]: a21 = a20.reshape(3,3,3)

In [5]: a21
Out[5]:
array([[[   1.        ,    4.80769231,    8.61538462],
[  12.42307692,   16.23076923,   20.03846154],
[  23.84615385,   27.65384615,   31.46153846]],

[[  35.26923077,   39.07692308,   42.88461538],
[  46.69230769,   50.5       ,   54.30769231],
[  58.11538462,   61.92307692,   65.73076923]],

[[  69.53846154,   73.34615385,   77.15384615],
[  80.96153846,   84.76923077,   88.57692308],
[  92.38461538,   96.19230769,  100.        ]]])

In [6]: print(a21[(1,1,1)])
50.5

## 切片

In [10]: a22 = np.linspace(1,10,5)

In [11]: a22
Out[11]: array([  1.  ,   3.25,   5.5 ,   7.75,  10.  ])

In [12]: print(a22[2:4])
[ 5.5   7.75]

In [5]: a21
Out[5]:
array([[[   1.        ,    4.80769231,    8.61538462],
[  12.42307692,   16.23076923,   20.03846154],
[  23.84615385,   27.65384615,   31.46153846]],

[[  35.26923077,   39.07692308,   42.88461538],
[  46.69230769,   50.5       ,   54.30769231],
[  58.11538462,   61.92307692,   65.73076923]],

[[  69.53846154,   73.34615385,   77.15384615],
[  80.96153846,   84.76923077,   88.57692308],
[  92.38461538,   96.19230769,  100.        ]]])

In [8]: slice1 = a21[1:3,1:3,1:3]

In [9]: slice1
Out[9]:
array([[[  50.5       ,   54.30769231],
[  61.92307692,   65.73076923]],

[[  84.76923077,   88.57692308],
[  96.19230769,  100.        ]]])

In [11]: a22
Out[11]: array([  1.  ,   3.25,   5.5 ,   7.75,  10.  ])

In [12]: print(a22[2:4])
[ 5.5   7.75]

In [13]: a22[1:]
Out[13]: array([  3.25,   5.5 ,   7.75,  10.  ])

In [14]: a22[1:-1]
Out[14]: array([ 3.25,  5.5 ,  7.75])

## 多维数组的数据类型

In [18]: a23 = np.logspace(1,10,5,base=2,dtype=np.float64)

In [19]: a23
Out[19]:
array([    2.        ,     9.51365692,    45.254834  ,   215.2694823 ,
1024.        ])

## 对数组的每个元素都进行计算

NumPy提供了大量的针对数组进行运算的函数，比如X是一个数组，np.sin(X)可以对数组中每一个元素都进行sin运算。

In [20]: a24 = np.linspace(0, np.pi/2, 10, dtype=np.float64)

In [21]: a24
Out[21]:
array([ 0.        ,  0.17453293,  0.34906585,  0.52359878,  0.6981317 ,
0.87266463,  1.04719755,  1.22173048,  1.3962634 ,  1.57079633])

In [22]: a25 = np.sin(a24)

In [23]: a25
Out[23]:
array([ 0.        ,  0.17364818,  0.34202014,  0.5       ,  0.64278761,
0.76604444,  0.8660254 ,  0.93969262,  0.98480775,  1.        ])

In [24]: a26 = np.linspace(0, np.pi*2, 16, dtype=np.float32)

In [25]: a26
Out[25]:
array([ 0.        ,  0.41887903,  0.83775806,  1.2566371 ,  1.67551613,
2.09439516,  2.51327419,  2.93215322,  3.35103226,  3.76991129,
4.18879032,  4.60766935,  5.02654839,  5.44542742,  5.86430645,
6.28318548], dtype=float32)

In [27]: a27 = np.sin(a26.reshape(4,4))

In [28]: a27
Out[28]:
array([[  0.00000000e+00,   4.06736642e-01,   7.43144870e-01,
9.51056540e-01],
[  9.94521916e-01,   8.66025388e-01,   5.87785184e-01,
2.07911611e-01],
[ -2.07911789e-01,  -5.87785363e-01,  -8.66025448e-01,
-9.94521916e-01],
[ -9.51056480e-01,  -7.43144751e-01,  -4.06736493e-01,
1.74845553e-07]], dtype=float32)

In [31]: a28 = np.array([1,2,3,4]).reshape(2,-1)

In [32]: a28
Out[32]:
array([[1, 2],
[3, 4]])

In [33]: a28*2
Out[33]:
array([[2, 4],
[6, 8]])

In [35]: a29 = np.ones((2,2))

In [36]: a29
Out[36]:
array([[ 1.,  1.],
[ 1.,  1.]])

In [37]: a28+a29
Out[37]:
array([[ 2.,  3.],
[ 4.,  5.]])

In [38]: a29>a28
Out[38]:
array([[False, False],
[False, False]], dtype=bool)

## 汇总类的运算

In [40]: np.sum(a28)
Out[40]: 10

In [41]: np.mean(a28)
Out[41]: 2.5

## 矩阵matrix

In [45]: a30 = np.matrix(np.linspace(1,10,9,dtype=np.float64).reshape(3,-1))

In [46]: a30
Out[46]:
matrix([[  1.   ,   2.125,   3.25 ],
[  4.375,   5.5  ,   6.625],
[  7.75 ,   8.875,  10.   ]])
In [48]: a31 = np.matrix(np.ones((3,3)))

In [49]: a31
Out[49]:
matrix([[ 1.,  1.,  1.],
[ 1.,  1.,  1.],
[ 1.,  1.,  1.]])

In [50]: np.dot(a30,a31)
Out[50]:
matrix([[  6.375,   6.375,   6.375],
[ 16.5  ,  16.5  ,  16.5  ],
[ 26.625,  26.625,  26.625]])

In [52]: a30 ** -1
Out[52]:
matrix([[  9.38565300e+14,  -1.87713060e+15,   9.38565300e+14],
[ -1.87713060e+15,   3.75426120e+15,  -1.87713060e+15],
[  9.38565300e+14,  -1.87713060e+15,   9.38565300e+14]])

In [53]: a30
Out[53]:
matrix([[  1.   ,   2.125,   3.25 ],
[  4.375,   5.5  ,   6.625],
[  7.75 ,   8.875,  10.   ]])

In [54]: a30 * (a30 ** -1)
Out[54]:
matrix([[ 0.8125 , -0.125  ,  0.     ],
[ 0.15625, -1.0625 ,  1.     ],
[ 0.     ,  0.     ,  2.     ]])

|
1天前
|

NumPy 教程 之 NumPy 迭代数组 6
NumPy教程之NumPy迭代数组第6部分。本节介绍NumPy迭代器对象numpy.nditer，一种灵活访问一个或多个数组元素的方法。通过示例演示如何利用external_loop标志参数遍历多维数组并将其按列组合为一维数组。输出展示了如何通过改变迭代标志实现不同维度数据的灵活访问。
9 3
|
1天前
|
Python
NumPy 教程 之 NumPy 迭代数组 5

6 3
|
2天前
|
Python
NumPy 教程 之 NumPy 迭代数组 2

10 4
|
2天前
|

NumPy 教程 之 NumPy 迭代数组 3

8 3
|
1天前
|
C语言 数据安全/隐私保护 Python
NumPy 教程 之 NumPy 迭代数组 4

5 1
|
3天前
|
Python
NumPy 教程 之 NumPy 广播(Broadcast) 4
NumPy广播允许不同形状的数组执行数值运算。简言之，较短数组通过前置1扩展至最长数组形状，输出形状取各输入的最大维度值。数组可在各维度相等或任一为1的情况下进行运算，否则会引发&quot;ValueError: frames are not aligned&quot;错误。
13 3
|
3天前
|
Python
NumPy 教程 之 NumPy 迭代数组 1

7 2
|
5天前
|

NumPy 教程 之 NumPy 高级索引 9
NumPy高级索引包括整数数组索引、布尔索引及花式索引，能实现对数组元素的灵活访问与复杂操作。其中，花式索引通过整数数组指定目标轴的下标来选取元素，不同于切片，它总是返回新数组。例如，对二维数组使用倒序索引数组时，会得到指定行的新数组：[[16 17 18 19], [24 25 26 27], [28 29 30 31], [4 5 6 7]]。
11 1
|
4天前
|
Python
NumPy 教程 之 NumPy 广播(Broadcast) 2
NumPy广播是处理不同形状的数组运算的一种强大工具。若两个数组形状一致，运算将在对应元素间进行。但在形状各异时，NumPy会自动应用广播机制以实现运算。例如，对于一个形状为(4,3)的数组a与一个形状为(3,)的数组b执行加法操作时，b会被“广播”到与a相同的形状，使得每个元素都能与其他数组的相应元素进行运算。具体示例中，将b加到a的每一行，实现了有效的元素级操作。
11 0
|
4天前
|

NumPy 教程 之 NumPy 高级索引 10
NumPy的高级索引功能强大，支持整数数组索引、布尔索引等多种方式，能够灵活访问和操作数组中的元素。花式索引通过整数数组选取特定位置的数据，不同于切片，它总是创建新数组。使用np.ix_处理多维索引时，可实现笛卡尔积效果，选取特定行与列的组合，如示例中从一个二维数组精确取出指定位置的子矩阵。
9 0