|
|
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
|
|
(3, 5)
|
|
2
|
|
'int32'
|
|
4
|
|
15
|
|
numpy.ndarray
|
|
array([6, 7, 8])
|
|
numpy.ndarray
创建数组
|
|
array([2, 3, 4])
|
|
dtype('int32')
|
|
dtype('float64')
|
|
array([[ 1.5, 2. , 3. ],
[ 4. , 5. , 6. ]])
|
|
array([[ 1.+0.j, 2.+0.j],
[ 3.+0.j, 4.+0.j]])
|
|
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
|
|
array([[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]]], dtype=int16)
|
|
array([[ 0., 0., 0.],
[ 0., 0., 0.]])
|
|
array([10, 15, 20, 25])
|
|
array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
打印数组
当你打印一个数组,NumPy以类似嵌套列表的形式显示它,但是呈以下布局:
- 最后的轴从左到右打印
- 次后的轴从顶向下打印
- 剩下的轴从顶向下打印,每个切片通过一个空行与下一个隔开
- 一维数组被打印成行,二维数组成矩阵,三维数组成矩阵列表。
|
|
[0 1 2 3 4 5]
|
|
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
|
|
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
|
|
[ 0 1 2 ..., 9997 9998 9999]
|
|
[[ 0 1 2 ..., 97 98 99]
[ 100 101 102 ..., 197 198 199]
[ 200 201 202 ..., 297 298 299]
...,
[9700 9701 9702 ..., 9797 9798 9799]
[9800 9801 9802 ..., 9897 9898 9899]
[9900 9901 9902 ..., 9997 9998 9999]]
|
|
4.基本运算
数组的算术运算是按元素的。新的数组被创建并且被结果填充
|
|
array([0, 1, 2, 3])
|
|
|
|
array([20, 29, 38, 47])
|
|
array([0, 1, 4, 9])
|
|
array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854])
|
|
array([ True, True, False, False], dtype=bool)
|
|
array([[2, 0],
[0, 4]])
|
|
array([[5, 4],
[3, 4]])
|
|
array([[ 0.3440055 , 0.19567887, 0.06385673],
[ 0.26831344, 0.08921971, 0.55817445]])
|
|
array([[ 3.3440055 , 3.19567887, 3.06385673],
[ 3.26831344, 3.08921971, 3.55817445]])
|
|
array([ 0. , 1.57079633, 3.14159265])
|
|
'float64'
|
|
array([ 1. , 2.57079633, 4.14159265])
|
|
array([ 0.54030231+0.84147098j, -0.84147098+0.54030231j,
-0.54030231-0.84147098j])
|
|
'complex128'
|
|
array([[ 0.88666447, 0.7829932 , 0.43766231],
[ 0.31927084, 0.02734765, 0.62587811]])
|
|
3.0798165795267631
|
|
0.027347653631032531
|
|
0.88666446599797044
这些运算默认应用到数组好像它就是一个数字组成的列表,无关数组的形状。然而,指定axis参数你可以吧运算应用到数组指定的轴上:
|
|
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
|
|
array([12, 15, 18, 21])
|
|
array([ 6, 22, 38])
|
|
array([[ 0, 1, 3, 6],
[ 4, 9, 15, 22],
[ 8, 17, 27, 38]], dtype=int32)
5.通用函数ufunc
Numpy提供常见的数学函数如 sin, cos 和 exp。在Numpy中,这些叫作通用函数 ufunc。在Numpy里这些函数作用按数组的元素运算,产生一个数组作为输出。
|
|
array([0, 1, 2])
|
|
array([ 1. , 2.71828183, 7.3890561 ])
|
|
array([ 0. , 1. , 1.41421356])
|
|
array([ 2., 0., 6.])
索引,切片和迭代
一维数组可以被索引、切片和迭代,就像列表和其它Python序列。
|
|
array([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729], dtype=int32)
|
|
8
|
|
array([ 8, 27, 64], dtype=int32)
|
|
array([-1000, 1, -1000, 27, -1000, 125, 216, 343, 512, 729], dtype=int32)
|
|
array([ 729, 512, 343, 216, 125, -1000, 27, -1000, 1, -1000], dtype=int32)
|
|
array([-1000, 1, -1000, 27, -1000, 125, 216, 343, 512, 729], dtype=int32)
|
|
0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,
|
|
array([[ 0, 1, 2, 3],
[10, 11, 12, 13],
[20, 21, 22, 23],
[30, 31, 32, 33],
[40, 41, 42, 43]])
|
|
23
|
|
array([ 2, 12, 22, 32, 42])
|
|
array([ 2, 12, 22, 32, 42])
|
|
array([[10, 11, 12, 13],
[20, 21, 22, 23]])
当少于轴数的索引被提供时,确失的索引被认为是整个切片:
|
|
array([40, 41, 42, 43])
b[i]中括号中的表达式被当作i和一系列:,来代表剩下的轴。NumPy也允许你使用“点”像b[i,…]。
点(…)代表许多产生一个完整的索引元组必要的分号。如果x是秩为5的数组(即它有5个轴),那么:
- x[1,2,…] 等同于 x[1,2,:,:,:]
- x[…,3] 等同于 x[:,:,:,:,3]
- x[4,…,5,:] 等同于 x[4,:,:,5,:]
|
|
[0 1 2 3]
[10 11 12 13]
[20 21 22 23]
[30 31 32 33]
[40 41 42 43]
|
|
0,1,2,3,10,11,12,13,20,21,22,23,30,31,32,33,40,41,42,43,
6.形状操作
更改数组的形状
一个数组的形状由它每个轴上的元素个数给出:
|
|
array([[ 4., 5., 9., 0.],
[ 8., 5., 5., 8.],
[ 8., 8., 8., 1.]])
|
|
(3, 4)
|
|
array([ 4., 5., 9., 0., 8., 5., 5., 8., 8., 8., 8., 1.])
|
|
array([[ 4., 9., 8., 5., 8., 8.],
[ 5., 0., 5., 8., 8., 1.]])
由ravel()展平的数组元素的顺序通常是 C风格 的,就是说,最右边的索引变化得最快,所以元素a[0,0]之后是a[0,1]。
如果数组被改变形状(reshape)成其它形状,数组仍然是 C风格 的。
Numpy通常创建一个以这个顺序保存数据的数组,所以ravel()将总是不需要复制它的参数。
但是如果数组是通过切片其它数组或有不同寻常的选项时,它可能需要被复制。
函数reshape()和ravel()还可以被同过一些可选参数构建成 FORTRAN风格 的数组,即最左边的索引变化最快。
reshape函数改变参数形状并返回它,而resize函数改变数组自身。
|
|
array([[ 4., 5.],
[ 9., 0.],
[ 8., 5.],
[ 5., 8.],
[ 8., 8.],
[ 8., 1.]])
|
|
array([[ 4., 5.],
[ 9., 0.],
[ 8., 5.],
[ 5., 8.],
[ 8., 8.],
[ 8., 1.]])
|
|
组合(stack)不同的数组
|
|
array([[ 5., 1.],
[ 4., 7.]])
|
|
array([[ 5., 1.],
[ 0., 6.]])
|
|
array([[ 5., 1.],
[ 4., 7.],
[ 5., 1.],
[ 0., 6.]])
|
|
array([[ 5., 1., 5., 1.],
[ 4., 7., 0., 6.]])
函数column_stack以列将一维数组合成二维数组,它等同与vstack对一维数组。
|
|
array([[ 5., 1., 5., 1.],
[ 4., 7., 0., 6.]])
|
|
array([[ 2.],
[ 8.]])
|
|
array([[ 4., 2.],
[ 2., 8.]])
|
|
array([[ 4.],
[ 2.],
[ 2.],
[ 8.]])
row_stack函数,另一方面,将一维数组以行组合成二维数组。
对那些维度比二维更高的数组,hstack沿着第二个轴组合,vstack沿着第一个轴组合,concatenate允许可选参数给出组合时沿着的轴。
在复杂情况下,r[]和c[]对创建沿着一个方向组合的数很有用,它们允许范围符号(“:”):
|
|
array([1, 2, 3, 0, 4])
将一个数组分割(split)成几个小数组
使用hsplit你能将数组沿着它的水平轴分割,或者指定返回相同形状数组的个数,或者指定在哪些列后发生分割:
|
|
array([[ 5., 6., 0., 7., 6., 5., 2., 9., 4., 2., 0., 7.],
[ 3., 5., 8., 7., 6., 1., 4., 2., 9., 6., 7., 8.]])
|
|
[array([[ 5., 6., 0., 7.],
[ 3., 5., 8., 7.]]), array([[ 6., 5., 2., 9.],
[ 6., 1., 4., 2.]]), array([[ 4., 2., 0., 7.],
[ 9., 6., 7., 8.]])]
|
|
[array([[ 5., 6., 0.],
[ 3., 5., 8.]]), array([[ 7.],
[ 7.]]), array([[ 6., 5., 2., 9., 4., 2., 0., 7.],
[ 6., 1., 4., 2., 9., 6., 7., 8.]])]
|
|
复制和视图
当运算和处理数组时,它们的数据有时被拷贝到新的数组有时不是。这通常是新手的困惑之源。这有三种情况:
- 完全不拷贝
– 简单的赋值不拷贝数组对象或它们的数据
|
|
(12,)
|
|
(3, 4)
Python 传递不定对象作为参数,所以函数调用不拷贝数组。
|
|
|
|
1726646200160
|
|
1726646200160
- 视图(view)和浅复制
– 不同的数组对象分享同一个数据。视图方法创造一个新的数组对象指向同一数据。
|
|
False
|
|
True
|
|
False
|
|
|
|
array([[ 0, 1, 2, 3],
[1234, 5, 6, 7],
[ 8, 9, 10, 11]])
切片数组返回它的一个视图:
|
|
array([[ 0, 10, 10, 3],
[1234, 10, 10, 7],
[ 8, 10, 10, 11]])
- 深复制
– 这个方法完全复制数组和它的数据
|
|
False
|
|
False
|
|
array([[9999, 10, 10, 3],
[1234, 10, 10, 7],
[ 8, 10, 10, 11]])
|
|
array([[ 0, 10, 10, 3],
[1234, 10, 10, 7],
[ 8, 10, 10, 11]])
7. 函数和方法method总览
创建数组
arange, array, copy, empty, empty_like, eye, fromfile, fromfunction, identity,
linspace, logspace, mgrid, ogrid, ones, ones_like, r , zeros, zeros_like
转化
astype, atleast 1d, atleast 2d, atleast 3d, mat
操作
array split, column stack, concatenate, diagonal, dsplit, dstack, hsplit, hstack, item,
newaxis, ravel, repeat, reshape, resize, squeeze, swapaxes, take, transpose, vsplit, vstack
询问
all, any, nonzero, where
排序
argmax, argmin, argsort, max, min, ptp, searchsorted, sort
运算
choose, compress, cumprod, cumsum, inner, fill, imag, prod, put, putmask, real, sum
基本统计
cov, mean, std, var
基本线性代数
cross, dot, outer, svd, vdot
|