基础

NumPy的主要对象是齐次多维数组。它是一个元素表(通常是数字),所有相同的类型,由正整数的元组索引。在NumPy维度被称为轴(axis)。轴的数量是等级(rank)。

例如,三维空间中一个点的坐标[1,2,1]是一个等级为1的数组,因为它具有一个坐标轴。该轴的长度为3.在下面的示例中,该数组具有等级2(它是二维的)。第一维(轴)的长度为2,第二维的长度为3。

[[  1. , 0. , 0 ],[  0. , 1. , 2. ]]

NumPy的数组类叫做ndarray,别名为array,有几个重要的属性
ndarray.ndim :维度
ndarray.shape :尺寸,如n行m列(n,m)
ndarray.size:元素总数
ndarray.dtype:一个描述数组中元素类型的对象。可以使用标准的Python类型创建或指定dtype。另外NumPy提供它自己的类型。numpy.int32,numpy.int16和numpy.float64是一些例子。
ndarray.itemsize:数组中每个元素的字节大小
ndarray.data:包含数组的实际元素的缓冲区.

>>> import numpy as np
>>> a = np.arange(15).reshape(3, 5)
>>> a
array([[ 0,  1,  2,  3,  4],[ 5,  6,  7,  8,  9],[10, 11, 12, 13, 14]])
>>> a.shape
(3, 5)
>>> a.ndim
2
>>> a.dtype.name
'int64'
>>> a.itemsize
8
>>> a.size
15
>>> type(a)
<type 'numpy.ndarray'>
>>> b = np.array([6, 7, 8])
>>> b
array([6, 7, 8])
>>> type(b)
<type 'numpy.ndarray'>

创建数组

>>> import numpy as np
>>> a = np.array([2,3,4])      #内部小括号,中括号都可以
>>> a
array([2, 3, 4])
>>> a.dtype
dtype('int64')
>>> b = np.array([1.2, 3.5, 5.1])
>>> b.dtype
dtype('float64')

容易犯的错

>>> a = np.array(1,2,3,4)    # WRONG
>>> a = np.array([1,2,3,4])  # RIGHT

二位数组创建

>>> b = np.array([(1.5,2,3), (4,5,6)])
>>> b
array([[ 1.5,  2. ,  3. ],[ 4. ,  5. ,  6. ]])

创建时可以指定元素类型

>>> c = np.array( [ [1,2], [3,4] ], dtype=complex )
>>> c
array([[ 1.+0.j,  2.+0.j],[ 3.+0.j,  4.+0.j]])

快捷创建函数

>>> np.zeros( (3,4) )
array([[ 0.,  0.,  0.,  0.],[ 0.,  0.,  0.,  0.],[ 0.,  0.,  0.,  0.]])
>>> np.ones( (2,3,4), dtype=np.int16 )                # dtype can also be specified
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)
>>> np.empty( (2,3) )                                 # uninitialized, output may vary
array([[  3.73603959e-262,   6.02658058e-154,   6.55490914e-260],[  5.30498948e-313,   3.14673309e-307,   1.00000000e+000]])

类比range函数可以使用以下方式创建,返回数组而不是list

>>> np.arange( 10, 30, 5 )
array([10, 15, 20, 25])
>>> np.arange( 0, 2, 0.3 )                 # it accepts float arguments
array([ 0. ,  0.3,  0.6,  0.9,  1.2,  1.5,  1.8])

上述方法不能预订元素个数,可以通过以下方法创建固定元素个数的数组

>>> from numpy import pi
>>> np.linspace( 0, 2, 9 )                 # 9 numbers from 0 to 2
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])
>>> x = np.linspace( 0, 2*pi, 100 )        # useful to evaluate function at lots of points
>>> f = np.sin(x)

创建数组的方法
array,zeros,zeros_like,ones,ones_like,empty,empty_like,arange,linspace,numpy.random.rand,numpy.random.randn,fromfunction,fromfile

打印数组

print函数打印,具体打印方式看代码结果

>>> a = np.arange(6)                         # 1d array
>>> print(a)
[0 1 2 3 4 5]
>>>
>>> b = np.arange(12).reshape(4,3)           # 2d array
>>> print(b)
[[ 0  1  2][ 3  4  5][ 6  7  8][ 9 10 11]]
>>>
>>> c = np.arange(24).reshape(2,3,4)         # 3d array
>>> print(c)
[[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]][[12 13 14 15][16 17 18 19][20 21 22 23]]]

如果打印过多,会自动省略一部分

>>> print(np.arange(10000))
[   0    1    2 ..., 9997 9998 9999]
>>>
>>> print(np.arange(10000).reshape(100,100))
[[   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]]

如果不想省略,改变打印参数set_printoptions

>>> np.set_printoptions(threshold='nan')

基本运算

>>> a = np.array( [20,30,40,50] )
>>> b = np.arange( 4 )
>>> b
array([0, 1, 2, 3])
>>> c = a-b
>>> c
array([20, 29, 38, 47])
>>> b**2
array([0, 1, 4, 9])
>>> 10*np.sin(a)
array([ 9.12945251, -9.88031624,  7.4511316 , -2.62374854])
>>> a<35
array([ True, True, False, False], dtype=bool)

如果想使用类似矩阵乘法运算,可使用dot函数

>>> A = np.array( [[1,1],
...             [0,1]] )
>>> B = np.array( [[2,0],
...             [3,4]] )
>>> A*B                         # elementwise product
array([[2, 0],[0, 4]])
>>> A.dot(B)                    # matrix product
array([[5, 4],[3, 4]])
>>> np.dot(A, B)                # another matrix product
array([[5, 4],[3, 4]])

也可以使用+= ,*=等运算

>>> a = np.ones((2,3), dtype=int)
>>> b = np.random.random(2,3)
>>> a *= 3
>>> a
array([[3, 3, 3],[3, 3, 3]])
>>> b += a
>>> b
array([[ 3.417022  ,  3.72032449,  3.00011437],[ 3.30233257,  3.14675589,  3.09233859]])
>>> a += b                  # b is not automatically converted to integer type
Traceback (most recent call last):...
TypeError: Cannot cast ufunc add output from dtype('float64') to dtype('int64') with casting rule 'same_kind'

不同元素类型的数组运算,类型自动上升转换

>>> a = np.ones(3, dtype=np.int32)
>>> b = np.linspace(0,pi,3)
>>> b.dtype.name
'float64'
>>> c = a+b
>>> c
array([ 1.        ,  2.57079633,  4.14159265])
>>> c.dtype.name
'float64'
>>> d = np.exp(c*1j)
>>> d
array([ 0.54030231+0.84147098j, -0.84147098+0.54030231j,-0.54030231-0.84147098j])
>>> d.dtype.name
'complex128'

很多一元运算可以使用函数计算

>>> a = np.random.random(2,3)
>>> a
array([[ 0.18626021,  0.34556073,  0.39676747],[ 0.53881673,  0.41919451,  0.6852195 ]])
>>> a.sum()
2.5718191614547998
>>> a.min()
0.1862602113776709
>>> a.max()
0.6852195003967595

可以指定axis来指定某一维度运算

>>> b = np.arange(12).reshape(3,4)
>>> b
array([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
>>>
>>> b.sum(axis=0)                            # sum of each column
array([12, 15, 18, 21])
>>>
>>> b.min(axis=1)                            # min of each row
array([0, 4, 8])
>>>
>>> b.cumsum(axis=1)                         # cumulative sum along each row
array([[ 0,  1,  3,  6],[ 4,  9, 15, 22],[ 8, 17, 27, 38]])

universal function

也可以使用数学运算,在numpy中叫做“universal functions”(u func)

>>> B = np.arange(3)
>>> B
array([0, 1, 2])
>>> np.exp(B)
array([ 1.        ,  2.71828183,  7.3890561 ])
>>> np.sqrt(B)
array([ 0.        ,  1.        ,  1.41421356])
>>> C = np.array([2., -1., 4.])
>>> np.add(B, C)
array([ 2.,  0.,  6.])

其他的看参考原文

索引,分片,遍历

一维数组与list相似

>>> a = np.arange(10)**3
>>> a
array([  0,   1,   8,  27,  64, 125, 216, 343, 512, 729])
>>> a[2]
8
>>> a[2:5]
array([ 8, 27, 64])
>>> a[:6:2] = -1000    # equivalent to a[0:6:2] = -1000; from start to position 6, exclusive, set every 2nd element to -1000
>>> a
array([-1000,     1, -1000,    27, -1000,   125,   216,   343,   512,   729])
>>> a[ : :-1]                                 # reversed a
array([  729,   512,   343,   216,   125, -1000,    27, -1000,     1, -1000])
>>> for i in a:
...     print(i**(1/3.))
...
nan
1.0
nan
3.0
nan
5.0
6.0
7.0
8.0
9.0

多维度数组每个轴可以有一个索引。这些索引用逗号分隔

>>> def f(x,y):
...     return 10*x+y
...
>>> b = np.fromfunction(f,(5,4),dtype=int)
>>> b
array([[ 0,  1,  2,  3],[10, 11, 12, 13],[20, 21, 22, 23],[30, 31, 32, 33],[40, 41, 42, 43]])
>>> b[2,3]
23
>>> b[0:5, 1]                       # each row in the second column of b
array([ 1, 11, 21, 31, 41])
>>> b[ : ,1]                        # equivalent to the previous example
array([ 1, 11, 21, 31, 41])
>>> b[1:3, : ]                      # each column in the second and third row of b
array([[10, 11, 12, 13],[20, 21, 22, 23]])

当提供的索引数量少于轴数时,缺少的索引被认为是完整的切片:

>>> b[-1]                                  # the last row. Equivalent to b[-1,:]
array([40, 41, 42, 43])

维度过多时可以使用“...”来表示。
例如一个五维数组

  • x[1,2,...] 等同于 x[1,2,:,:,:],
  • x[...,3] 等同 x[:,:,:,:,3]
  • x[4,...,5,:] 等同 x[4,:,:,5,:].
>>> c = np.array( [[[  0,  1,  2],               # a 3D array (two stacked 2D arrays)
...                 [ 10, 12, 13]],
...                [[100,101,102],
...                 [110,112,113]]])
>>> c.shape
(2, 2, 3)
>>> c[1,...]                                   # same as c[1,:,:] or c[1]
array([[100, 101, 102],[110, 112, 113]])
>>> c[...,2]                                   # same as c[:,:,2]
array([[  2,  13],[102, 113]])

遍历多维度数组遵从第一维度

>>> for row in b:
...     print(row)
...
[0 1 2 3]
[10 11 12 13]
[20 21 22 23]
[30 31 32 33]
[40 41 42 43]

如果想一个一个元素遍历,可以使用flat(扁平化)属性

>>> for element in b.flat:
...     print(element)
...
0
1
2
3
10
11
12
13
20
21
22
23
30
31
32
33
40
41
42
43

数组形状操作

改变形状

>>> a = np.floor(10*np.random.random(3,4))
>>> a
array([[ 2.,  8.,  0.,  6.],[ 4.,  5.,  1.,  1.],[ 8.,  9.,  3.,  6.]])
>>> a.shape
(3, 4)
>>> a.ravel()  # returns the array, flattened
array([ 2.,  8.,  0.,  6.,  4.,  5.,  1.,  1.,  8.,  9.,  3.,  6.])
>>> a.reshape(6,2)  # returns the array with a modified shape
array([[ 2.,  8.],[ 0.,  6.],[ 4.,  5.],[ 1.,  1.],[ 8.,  9.],[ 3.,  6.]])
>>> a.T  # returns the array, transposed
array([[ 2.,  4.,  8.],[ 8.,  5.,  9.],[ 0.,  1.,  3.],[ 6.,  1.,  6.]])
>>> a.T.shape
(4, 3)
>>> a.shape
(3, 4)

reshape返回重构后的数组,不改变引用的数组本身,而resize直接在引用的数组上重构。

>>> a
array([[ 2.,  8.,  0.,  6.],[ 4.,  5.,  1.,  1.],[ 8.,  9.,  3.,  6.]])
>>> a.resize((2,6))
>>> a
array([[ 2.,  8.,  0.,  6.,  4.,  5.],[ 1.,  1.,  8.,  9.,  3.,  6.]])

如果整形操作中指定尺寸为-1,则自动计算尺寸

>>> a.reshape(3,-1)
array([[ 2.,  8.,  0.,  6.],[ 4.,  5.,  1.,  1.],[ 8.,  9.,  3.,  6.]])

堆叠
多个数组堆叠到一起

>>> a = np.floor(10*np.random.random(2,2))
>>> a
array([[ 8.,  8.],[ 0.,  0.]])
>>> b = np.floor(10*np.random.random(2,2))
>>> b
array([[ 1.,  8.],[ 0.,  4.]])
>>> np.vstack((a,b))
array([[ 8.,  8.],[ 0.,  0.],[ 1.,  8.],[ 0.,  4.]])
>>> np.hstack((a,b))
array([[ 8.,  8.,  1.,  8.],[ 0.,  0.,  0.,  4.]])

column_stack是将一维数组作为列形成二维数组,

>>> from numpy import newaxis
>>> np.column_stack((a,b))   # With 2D arrays
array([[ 8.,  8.,  1.,  8.],[ 0.,  0.,  0.,  4.]])
>>> a = np.array([4.,2.])
>>> b = np.array([2.,8.])
>>> a[:,newaxis]  # This allows to have a 2D columns vector
array([[ 4.],[ 2.]])
>>> np.column_stack((a[:,newaxis],b[:,newaxis]))
array([[ 4.,  2.],[ 2.,  8.]])
>>> np.vstack((a[:,newaxis],b[:,newaxis])) # The behavior of vstack is different
array([[ 4.],[ 2.],[ 2.],[ 8.]])

如果想用更复杂的堆叠可以使用c_和r_,他们允许使用":"

>>> np.r_[1:4,0,4]
array([1, 2, 3, 0, 4])

一个数组切分成多个小片段数组
使用hsplit可以指定拆分的数组个数,或者在指定横轴位置后拆分

>> a = np.floor(10*np.random.random(2,12))
>>> a
array([[ 9.,  5.,  6.,  3.,  6.,  8.,  0.,  7.,  9.,  7.,  2.,  7.],[ 1.,  4.,  9.,  2.,  2.,  1.,  0.,  6.,  2.,  2.,  4.,  0.]])
>>> np.hsplit(a,3)   # 拆分成等份的三个数组
[array([[ 9.,  5.,  6.,  3.],[ 1.,  4.,  9.,  2.]]), array([[ 6.,  8.,  0.,  7.],[ 2.,  1.,  0.,  6.]]), array([[ 9.,  7.,  2.,  7.],[ 2.,  2.,  4.,  0.]])]
>>> np.hsplit(a,(3,4))   # 在第三列后和第四列后拆分
[array([[ 9.,  5.,  6.],[ 1.,  4.,  9.]]), array([[ 3.],[ 2.]]), array([[ 6.,  8.,  0.,  7.,  9.,  7.,  2.,  7.],[ 2.,  1.,  0.,  6.,  2.,  2.,  4.,  0.]])]

复制和视图

简单的赋值并不会产生复制对象

>>> a = np.arange(12)
>>> b = a            # no new object is created
>>> b is a           # a and b are two names for the same ndarray object
True
>>> b.shape = 3,4    # changes the shape of a
>>> a.shape
(3, 4)
>>> def f(x):
...     print(id(x))
...
>>> id(a)                           # id is a unique identifier of an object
148293216
>>> f(a)
148293216

view or shadow copy
id不同但是改变元素值,二者都改变

>>> c = a.view()
>>> c is a
False
>>> c.base is a                        # c is a view of the data owned by a
True
>>> c.flags.owndata
False
>>>
>>> c.shape = 2,6                      # a's shape doesn't change
>>> a.shape
(3, 4)
>>> c[0,4] = 1234                      # a's data changes
>>> a
array([[   0,    1,    2,    3],[1234,    5,    6,    7],[   8,    9,   10,   11]])

分片产生的是视图(view)

>>> s = a[ : , 1:3]     # spaces added for clarity; could also be written "s = a[:,1:3]"
>>> s[:] = 10           # s[:] is a view of s. Note the difference between s=10 and s[:]=10
>>> a
array([[   0,   10,   10,    3],[1234,   10,   10,    7],[   8,   10,   10,   11]])

深度复制

>>> d = a.copy()                          # a new array object with new data is created
>>> d is a
False
>>> d.base is a                           # d doesn't share anything with a
False
>>> d[0,0] = 9999
>>> a
array([[   0,   10,   10,    3],[1234,   10,   10,    7],[   8,   10,   10,   11]])
image.png
image.png

广播规则

广播规则允许universal function 在有意义的方法处理不同shape的输入数据。
当两个数组运算时,numpy逐个比较他们的shape,从最后一个维度比较,并且比较过程在方法工作的前面
可以广播的规则如下

  • 他们是相等的
  • 或者其中一个为1
    否则返回ValueError: frames are not aligned
    例子:
    3和3相等所以可以广播,结果为3
Image  (3d array): 256 x 256 x 3
Scale  (1d array):             3
Result (3d array): 256 x 256 x 3

1和5中有个1,可以广播,结果返回5

A      (4d array):  8 x 1 x 6 x 1
B      (3d array):      7 x 1 x 5
Result (4d array):  8 x 7 x 6 x 5

更多的例子

A      (2d array):  5 x 4
B      (1d array):      1
Result (2d array):  5 x 4

A (2d array): 5 x 4
B (1d array): 4
Result (2d array): 5 x 4

A (3d array): 15 x 3 x 5
B (3d array): 15 x 1 x 5
Result (3d array): 15 x 3 x 5

A (3d array): 15 x 3 x 5
B (2d array): 3 x 5
Result (3d array): 15 x 3 x 5

A (3d array): 15 x 3 x 5
B (2d array): 3 x 1
Result (3d array): 15 x 3 x 5

>>> x = np.arange(4)
>>> xx = x.reshape(4,1)
>>> y = np.ones(5)
>>> z = np.ones((3,4))>>> x.shape
(4,)>>> y.shape
(5,)>>> x + y
<type 'exceptions.ValueError'>: shape mismatch: objects cannot be broadcast to a single shape>>> xx.shape
(4, 1)>>> y.shape
(5,)>>> (xx + y).shape
(4, 5)>>> xx + y
array([[ 1.,  1.,  1.,  1.,  1.],[ 2.,  2.,  2.,  2.,  2.],[ 3.,  3.,  3.,  3.,  3.],[ 4.,  4.,  4.,  4.,  4.]])>>> x.shape
(4,)>>> z.shape
(3, 4)>>> (x + z).shape
(3, 4)>>> x + z
array([[ 1.,  2.,  3.,  4.],[ 1.,  2.,  3.,  4.],[ 1.,  2.,  3.,  4.]])

花式索引和索引技巧

NumPy提供比常规Python序列更多的索引功能。除了通过整数和切片进行索引之外,正如我们之前所看到的,数组可以通过整数数组和布尔数组索引。

索引数组索引

>>> a = np.arange(12)**2                       # the first 12 square numbers
>>> i = np.array( [ 1,1,3,8,5 ] )              # an array of indices
>>> a[i]                                       # the elements of a at the positions i
array([ 1,  1,  9, 64, 25])
>>>
>>> j = np.array( [ [ 3, 4], [ 9, 7 ] ] )      # a bidimensional array of indices
>>> a[j]                                       # the same shape as j
array([[ 9, 16],[81, 49]])

当数组a为多维数组时,索引指向a的第一维度,下面为一个多维数组的例子

>>> palette = np.array( [ [0,0,0],                # black
...                       [255,0,0],              # red
...                       [0,255,0],              # green
...                       [0,0,255],              # blue
...                       [255,255,255] ] )       # white
>>> image = np.array( [ [ 0, 1, 2, 0 ],           # each value corresponds to a color in the palette
...                     [ 0, 3, 4, 0 ]  ] )
>>> palette[image]                            # the (2,4,3) color image
array([[[  0,   0,   0],[255,   0,   0],[  0, 255,   0],[  0,   0,   0]],[[  0,   0,   0],[  0,   0, 255],[255, 255, 255],[  0,   0,   0]]])

我们也可以指定超过一个索引,但是索引数组一定是相同的shape

>>> a = np.arange(12).reshape(3,4)
>>> a
array([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
>>> i = np.array( [ [0,1],                        # indices for the first dim of a
...                 [1,2] ] )
>>> j = np.array( [ [2,1],                        # indices for the second dim
...                 [3,3] ] )
>>>
>>> a[i,j]                                     # i and j must have equal shape
array([[ 2,  5],[ 7, 11]])
>>>
>>> a[i,2]
array([[ 2,  6],[ 6, 10]])
>>>
>>> a[:,j]                                     # i.e., a[ : , j]
array([[[ 2,  1],[ 3,  3]],[[ 6,  5],[ 7,  7]],[[10,  9],[11, 11]]])

自然的,我们可以把i,j放到一个list中,然后使用这个list来索引

>>> l = [i,j]
>>> a[l]                                       # equivalent to a[i,j]
array([[ 2,  5],[ 7, 11]])

然而,我们不能把i,j放到一个数组中然后索引,会造成i,j都指向第一维度的索引,而出现超出索引范围的编译错误

>>> s = np.array( [i,j] )
>>> a[s]                                       # not what we want
Traceback (most recent call last):File "<stdin>", line 1, in ?
IndexError: index (3) out of range (0<=index<=2) in dimension 0
>>>
>>> a[tuple(s)]                                # same as a[i,j]
array([[ 2,  5],[ 7, 11]])

另一个使用是查询时间系数序列的最大值

>>> time = np.linspace(20, 145, 5)                 # time scale
>>> data = np.sin(np.arange(20)).reshape(5,4)      # 4 time-dependent series
>>> time
array([  20.  ,   51.25,   82.5 ,  113.75,  145.  ])
>>> data
array([[ 0.        ,  0.84147098,  0.90929743,  0.14112001],[-0.7568025 , -0.95892427, -0.2794155 ,  0.6569866 ],[ 0.98935825,  0.41211849, -0.54402111, -0.99999021],[-0.53657292,  0.42016704,  0.99060736,  0.65028784],[-0.28790332, -0.96139749, -0.75098725,  0.14987721]])
>>>
>>> ind = data.argmax(axis=0)                   # index of the maxima for each series
>>> ind
array([2, 0, 3, 1])
>>>
>>> time_max = time[ ind]                       # times corresponding to the maxima
>>>
>>> data_max = data[ind, xrange(data.shape[1])] # => data[ind[0],0], data[ind[1],1]...
>>>
>>> time_max
array([  82.5 ,   20.  ,  113.75,   51.25])
>>> data_max
array([ 0.98935825,  0.84147098,  0.99060736,  0.6569866 ])
>>>
>>> np.all(data_max == data.max(axis=0))
True

也可以使用它,对数组赋值

>>> a = np.arange(5)
>>> a
array([0, 1, 2, 3, 4])
>>> a[[1,3,4]] = 0
>>> a
array([0, 0, 2, 0, 0])

布尔数组索引
当我们用(整数)索引数组索引数组时,我们提供了要选择的索引列表。布尔指数的方法是不同的; 我们明确地选择我们想要的数组中的哪些项目,哪些不是我们想要的。

布尔索引最自然的方法就是使用与原始数组shape相同的布尔数组:

>>> a = np.arange(12).reshape(3,4)
>>> b = a > 4
>>> b                                          # b is a boolean with a's shape
array([[False, False, False, False],[False,  True,  True,  True],[ True,  True,  True,  True]], dtype=bool)
>>> a[b]                                       # 1d array with the selected elements
array([ 5,  6,  7,  8,  9, 10, 11])

这个方法在赋值中很有用,省略了循环结构

>>> a[b] = 0                                   # All elements of 'a' higher than 4 become 0
>>> a
array([[0, 1, 2, 3],[4, 0, 0, 0],[0, 0, 0, 0]])

另一种使用方法和数字索引很相似,对于每一个维度使用一个一维度bool数组来选择我们想要的分片

>>> a = np.arange(12).reshape(3,4)
>>> b1 = np.array([False,True,True])             # first dim selection
>>> b2 = np.array([True,False,True,False])       # second dim selection
>>>
>>> a[b1,:]                                   # selecting rows
array([[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
>>>
>>> a[b1]                                     # same thing
array([[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
>>>
>>> a[:,b2]                                   # selecting columns
array([[ 0,  2],[ 4,  6],[ 8, 10]])
>>>
>>> a[b1,b2]                                  # a weird thing to do
array([ 4, 10])

ix_()函数
网格化函数,和ogrid,mgrid,meshgrid一类,通过这个函数再结合广播规则。
ix_()函数可用于不同的载体结合,以便获得对于每一个n-uplet结果。

>>> a = np.arange(10).reshape(2, 5)
>>> a
array([[0, 1, 2, 3, 4],[5, 6, 7, 8, 9]])
>>> ixgrid = np.ix_([0,1], [2,4])
>>> ixgrid
(array([[0],[1]]), array([[2, 4]]))
>>> ixgrid[0].shape, ixgrid[1].shape
((2, 1), (1, 2))
>>> a[ixgrid]
array([[2, 4],[7, 9]])

例如,如果要计算从每个矢量a,b和c取得的所有三元组的所有a + b * c:

>>> a = np.array([2,3,4,5])
>>> b = np.array([8,5,4])
>>> c = np.array([5,4,6,8,3])
>>> ax,bx,cx = np.ix_(a,b,c)
>>> ax
array([[[2]],[[3]],[[4]],[[5]]])
>>> bx
array([[[8],[5],[4]]])
>>> cx
array([[[5, 4, 6, 8, 3]]])
>>> ax.shape, bx.shape, cx.shape
((4, 1, 1), (1, 3, 1), (1, 1, 5))
>>> result = ax+bx*cx
>>> result
array([[[42, 34, 50, 66, 26],[27, 22, 32, 42, 17],[22, 18, 26, 34, 14]],[[43, 35, 51, 67, 27],[28, 23, 33, 43, 18],[23, 19, 27, 35, 15]],[[44, 36, 52, 68, 28],[29, 24, 34, 44, 19],[24, 20, 28, 36, 16]],[[45, 37, 53, 69, 29],[30, 25, 35, 45, 20],[25, 21, 29, 37, 17]]])
>>> result[3,2,4]
17
>>> a[3]+b[2]*c[4]
17

线性代数

linalg.py包

>>> import numpy as np
>>> a = np.array([[1.0, 2.0], [3.0, 4.0]])
>>> print(a)
[[ 1.  2.][ 3.  4.]]

>>> a.transpose()
array([[ 1., 3.],
[ 2., 4.]])

>>> np.linalg.inv(a)
array([[-2. , 1. ],
[ 1.5, -0.5]])

>>> u = np.eye(2) # unit 2x2 matrix; “eye” represents “I”
>>> u
array([[ 1., 0.],
[ 0., 1.]])
>>> j = np.array([[0.0, -1.0], [1.0, 0.0]])

>>> np.dot (j, j) # matrix product
array([[-1., 0.],
[ 0., -1.]])

>>> np.trace(u) # trace
2.0

>>> y = np.array([[5.], [7.]])
>>> np.linalg.solve(a, y)
array([[-3.],
[ 4.]])

>>> np.linalg.eig(j)
(array([ 0.+1.j, 0.-1.j]), array([[ 0.70710678+0.j , 0.70710678-0.j ],
[ 0.00000000-0.70710678j, 0.00000000+0.70710678j]]))

Parameters:square matrix
ReturnsThe eigenvalues, each repeated according to its multiplicity.The normalized (unit "length") eigenvectors, such that thecolumn ``v[:,i]`` is the eigenvector corresponding to theeigenvalue ``w[i]`` .

技巧和提示

给出一个简短而有用的提示列表。
自动reshape

>>> a = np.arange(30)
>>> a.shape = 2,-1,3  # -1 means "whatever is needed"
>>> a.shape
(2, 5, 3)
>>> a
array([[[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11],[12, 13, 14]],[[15, 16, 17],[18, 19, 20],[21, 22, 23],[24, 25, 26],[27, 28, 29]]])

数组堆叠
与matlab方式m[x;y](x,y都为相同长度矩阵)相同 ,
python可以使用column_stack, dstack, hstack and vstack

x = np.arange(0,10,2)                     # x=([0,2,4,6,8])
y = np.arange(5)                          # y=([0,1,2,3,4])
m = np.vstack([x,y])                      # m=([[0,2,4,6,8],#     [0,1,2,3,4]])
xy = np.hstack([x,y])                     # xy =([0,2,4,6,8,0,1,2,3,4])

histgram
应用于数组的NumPy 直方图函数返回一对向量:数组的直方图和分箱的向量。当心: matplotlib也有一个函数来建立直方图(称为hist,如在Matlab中),不同于NumPy中的。主要区别是pylab.hist自动绘制直方图,而 numpy.histogram只生成数据。

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> # Build a vector of 10000 normal deviates with variance 0.5^2 and mean 2
>>> mu, sigma = 2, 0.5
>>> v = np.random.normal(mu,sigma,10000)
>>> # Plot a normalized histogram with 50 bins
>>> plt.hist(v, bins=50, normed=1)       # matplotlib version (plot)
>>> plt.show()

![在这里插入图片描述](https://img-blog.csdn.net/2018102022181198?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDExMzM2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

>>> # Compute the histogram with numpy and then plot it
>>> (n, bins) = np.histogram(v, bins=50, normed=True)  # NumPy version (no plot)
>>> plt.plot(.5*(bins[1:]+bins[:-1]), n)
>>> plt.show()

![在这里插入图片描述](https://img-blog.csdn.net/20181020221824888?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDExMzM2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 文章转自https://www.jianshu.com/p/7faf137775c8

numpy-array相关推荐

  1. numpy使用np.argmax函数获取一维数组中最大值所在的索引(index of largest value in numpy array with np.argmax)

    numpy使用np.argmax函数获取一维数组中最大值所在的索引(index of largest value in numpy array with np.argmax) 目录 numpy使用np ...

  2. ValueError: cannot convert to ‘int64‘-dtype NumPy array with missing values. Specify an appropriate

    ValueError: cannot convert to 'int64'-dtype NumPy array with missing values. Specify an appropriate ...

  3. numpy使用[]语法索引二维numpy数组中指定行列位置的数值内容(access value at certain row and column in numpy array)

    numpy使用[]语法索引二维numpy数组中指定行列位置的数值内容(access value at certain row and column in numpy array) 目录

  4. numpy使用[]语法索引二维numpy数组中指定指定行之后所有数据行的数值内容(accessing rows in numpy array after specifc row)

    numpy使用[]语法索引二维numpy数组中指定指定行之后所有数据行的数值内容(accessing rows in numpy array after specifc row) 目录

  5. numpy使用[]语法索引二维numpy数组中指定数据行的数值内容(accessing the specific row in numpy array)

    numpy使用[]语法索引二维numpy数组中指定数据行的数值内容(accessing the specific row in numpy array) 目录 numpy使用[]语法索引二维numpy ...

  6. numpy使用[]语法索引二维numpy数组中指定范围数据行的数值内容(accessing rows in numpy array with specific range)

    numpy使用[]语法索引二维numpy数组中指定范围数据行的数值内容(accessing rows in numpy array with specific range) 目录

  7. numpy使用[]语法索引二维numpy数组中指定指定行之前所有数据行的数值内容(accessing rows in numpy array before specifc row)

    numpy使用[]语法索引二维numpy数组中指定指定行之前所有数据行的数值内容(accessing rows in numpy array before specifc row) 目录

  8. numpy使用[]语法索引二维numpy数组中指定指定列之后所有数据列的数值内容(accessing columns in numpy array after specifc column)

    numpy使用[]语法索引二维numpy数组中指定指定列之后所有数据列的数值内容(accessing columns in numpy array after specifc column) 目录

  9. numpy使用[]语法索引二维numpy数组中指定数据列的数值内容(accessing the specific column in numpy array)

    numpy使用[]语法索引二维numpy数组中指定数据列的数值内容(accessing the specific column in numpy array) 目录 numpy使用[]语

  10. python编写自定义函数计算一维numpy数组中与指定目标数值最接近(距离最近)的数值(find closest value in numpy array to a certain value)

    python编写自定义函数计算一维numpy数组中与指定目标数值最接近(距离最近)的数值(find closest value in numpy array to a certain value) 目 ...

最新文章

  1. 扩展资源服务器解决oauth2 性能瓶颈
  2. numpy 笔记:finfo
  3. js判断是否为数字_第23题:JavaScript 中如何判断变量是否为数字 ?
  4. spring 配置只读事务_只读副本和Spring Data第3部分:配置两个实体管理器
  5. UVA-1623 Enter The Dragon (贪心)
  6. 接雨水12 · Trapping Rain Water12
  7. 六级词汇打卡第三天(三)
  8. scrapy工作流程
  9. oracle_linux安装oracle_12.1.0
  10. thinkphp count distinct
  11. c++sizeof求类大小 sizeof与strlen对比
  12. android mp3文件图片,android 完美获取音乐文件中的专辑图片并显示
  13. was 部署php,was 配置web服务器
  14. php项目代做,代做PHP开发技术程序、php网站代码代写
  15. js多维数组包含有children时,将数组平铺成一维数组
  16. python调用PHP
  17. Halcon 第七章『图像的几何变换』◆第1节:图像的仿射变换(位置变换、形状变换)及应用
  18. 小灰灰的APP学习之路(三)--创建一个简单的问答选择项目
  19. 如何实现给PDF文件添加图片
  20. 闪动的TextView

热门文章

  1. 生活:小孩的世界很简单
  2. 一阶电路中的时间常数_你知道RC电路和RL电路中时间常数的来源么?
  3. vue 引用src中的文件_Vue中引用第三方JS文件
  4. bzoj1237 [SCOI2008]配对 贪心结论+插数dp
  5. 【英语学习】【Daily English】U01 Greetings / L04 Hello, this is Peter Jones speaking
  6. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (15) - L1数据缓存/读写地址转换
  7. Eigen官网教程(6) Map类
  8. Java中的类变量(静态变量static的具体用法快速入门))
  9. 计算机专业课程项目教学教学设计,高职旅游管理专业计算机课程项目化教学设计...
  10. 给linux添加新硬盘