Numpy And Scipy笔记(一)
文章目录
NumPy
NumPy 数组
`ndarray`与list类似,但是它只允许存储一种类型的数据。这样能得更好的弹性。
|
|
|
|
|
|
10 loops, best of 3: 29.9 ms per loop
|
|
1 loops, best of 3: 947 ms per loop
使用matrix
进行线性代数操作,与ndarray不同的是matrix对象只能是二维的。
|
|
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-8-704c01cd77cc> in <module>()
1 # 创建3D numpy数组
----> 2 arr = np.zeroes(3,3,3)
3
4 # 将ndarray转为matrix
5 mat = np.matrix(arr)
AttributeError: 'module' object has no attribute 'zeroes'
数组的创建和数据类型
|
|
(10000,)
注意
:上面对数组结构的修改只是提供了对同一份内存数据的不同视图。修改任何一个数组,都会影响所有数组。如果希望单独修改每一个数组,则应该使用'numpy.copy
对数组进行复制。
记录数组(recarray
元素为结构化数据)
|
|
[(0, 0.0, '') (0, 0.0, '')]
[(1, 2.0, 'Hello') (2, 3.0, 'World')]
|
|
[(1, 0.0, 'Hello'), (2, 1.0, 'World')]
|
|
array([1, 2], dtype=int32)
索引和切片
python中的list可以通过索引取得元素,但是无法不遍历而获取整列。在NumPy中,索引则更为灵活。
|
|
2
2
[2 4]
[3 4]
复杂的条件索引可以使用numpy.where()
。使用这个函数可以基于条件返回需要的数据,而不通过索引。
|
|
(array([2, 3, 4]),)
[3 4 5]
|
|
[1 2]
[False False True True True]
[3 4 5]
在元素数量较大时,使用布尔值过滤通常会更快。还可以使用~
对数组中的布尔值取反,它的速度会比重新执行numpy.where
函数更快。
布尔语句和NumPy数组
布尔语句通常与and
和or
操作符组合使用,用于布尔值比较。但是在NumPy数组中,你可以只能使用&
和|
,这使得能快速的比较布尔值。
下例使用数组模拟图像:
|
|
注意
:在构建组合布尔参数时,需要使用括号。
|
|
文件读写
文本文件
通过NumPy提供的loadtxt
方法可以直接将数据加载为numpy.ndarray
格式。如果数据是按行和列的形式组织的,loadtxt将会使用合适的数据类型加载数据。可以使用numpy.savetxt
来快速生成numpy.readtxt
。
|
|
[[ 0.77167676 0.92569314 0.85121034]
[ 0.57092315 0.54171279 0.28679945]
[ 0.87396743 0.95719303 0.31715228]]
7.716767609951945550e-01 9.256931439674558337e-01 8.512103364017590268e-01
5.709231475688880675e-01 5.417127876887067872e-01 2.867994483215262624e-01
8.739674341488654630e-01 9.571930323898591997e-01 3.171522785297289371e-01
如果每列的格式不同,仍然可以通过指定列类型来加载数据。最终加载的数据是recarray
。
|
|
array(['XR21', 'XR22'],
dtype='|S4')
至NumPy1.8,numpy都没有将recarry
数据保存为文本的方法。如果需要保存recarry结构数据,可以使用matplotlib.mlab
。
二进制文件
二进制文件在文件大小和读写速度上都有优势。
在NumPy
中可以使用numpy.save
和numpy.load
访问二进制数据。主要限制在于只能使用NumPy进行读取。如果对数据的移植性有要求,应该使用scipy.io
。
|
|
(1000, 1000)
与文本文件不能直接保存recarray数据不同。numpy.save和numpy.savez都可以处理numpy.recarray对象。
数学计算
Python自带的math
模块无法处理NumPy数组。NumPy数组自带了数学计算工具。这些工具是专门针对NumPy数组对象进行了优化的。
线性代数
默认情况下NumPy的数组与线性代数中的矩阵并不相同。数学操作将被应用到数组的每个元素上。如果要进行转置和点乘,则可以使用numpy.transpose
和numpy.dot
。如果使用numpy.matrix
类型的对象,则可以使用纯粹的矩阵运算。
示例矩阵:
$$
\begin{align} \
3x + 6y - 5z = 12 \
x - 3y + 2z = -2 \
5x -y + 4z = 10 \
\end{align}
$$
$$
\begin{bmatrix}
3 & 6 & -5 \
1 & -3 & 2 \
5 & -1 & 4 \
\end{bmatrix}
\begin{bmatrix}
x \
y \
z \
\end{bmatrix} =
\begin{bmatrix}
12 \
-2 \
10 \
\end{bmatrix}
$$
下面使用矩阵来表达 $ AX = B $,解该矩阵方程,即:$ X = A^{-1}B $
|
|
The slowest run took 4.52 times longer than the fastest. This could mean that an intermediate result is being cached
10000 loops, best of 3: 28.8 µs per loop
matrix([[ 1.75],
[ 1.75],
[ 0.75]])
下面不使用numpy.matrix来解该方程。
|
|
The slowest run took 5.85 times longer than the fastest. This could mean that an intermediate result is being cached
100000 loops, best of 3: 11 µs per loop
array([[ 1.75],
[ 1.75],
[ 0.75]])
上面两种方法都可以进行线性代数计算,虽然使用numpy.matrix更直观,但是实际应用中使用numpy.array更多一些。NumPy的数组广泛的被使用在Python的各种科学计算环境中,bug比numpy.matrix要更少一些,另外,使用numpy.array的方法计算速度会更快一点。
如果将numpy.matrix当作numpy.array传递给函数时可能会产生麻烦,所以应该尽量使用numpy.array。
文章作者 Jamsa
上次更新 2017-03-20