numpy数组基本操作:numpy数组的切片和索引

@TOC

切片

a : [[[[ 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]]

  [[30 31 32 33 34]
   [35 36 37 38 39]]]]
   
#有两种写法:

#写法1:(这种方法用于选择多条数据,有几个维度,就有几个’:‘,并且维度和’[‘的数量相对应,从左向右数,第一个括号可以理解成0维,那么’:1‘,就表示选择第一个,也就是:
[[[ 0  1  2  3  4]
   [ 5  6  7  8  9]]

  [[10 11 12 13 14]
   [15 16 17 18 19]],其他的以此类推)
a[:1, :1, :1, :4]
结果:[[[[0 1 2 3]]]]

#写法2:(在某些维度你只要选择一个,不用选择多个,则可以用这个方法)
a[1,1,1,4]
结果:39

#写法3:结合写法2和写法1
a[0,0,0,:4]
结果:[0 1 2 3]

从上面可以看到写法3和写法1的元素的值是相同的,但括号的个数却不同,因此如果想要取出来的array数组的维度不变用方法1,如果想要变成一个一维的array数组,可用方法3.
小的知识点:
如果对切片后的数据进行了修改,那么原始的数据也会被修改,若想不改变原始数据,那么用copy()方法可以解决这个问题

索引

array[表达式1()表达式2()表达式3]:中间的括号可以是’&‘,’|',通过这样运算出来的结果是一个bool索引,满足条件的在这个array数组中是True,反之为False。在表达式中还可以用~来表示取反操作。

np.subtract.outer(b,a)

应用:b中的每一个数减去a,每执行一次减法就生成一个行向量,最后把所有向量拼接起来拼成一个矩阵。

numpy.linalg.det()

作用:计算行列式

np.atleast_2d

作用:在不破坏原有形状的样子,把数据分成两个array

一些知识点:

1.顶级方法和对象方法:
顶级方法不会对自身进行改变,那么什么是顶级方法呢?比如:np.append(a,5),这个并不会修改a本身,而a.append(5),可以让a中的值增加一个5.

每日一练(10题):

笔者在每一题后设置了分数,笔者认为打出来的分数依然可以对你的学习进行评估。(低于60:代表需要重新学习。60-80:恭喜你掌握了大部分,但有一些细节还需要加深。80-100:太好了,你的学习太棒了)
1.创建一个大小为10的数组,值为0到1之间,不包含0和1(10)

np.linspace(0, 1, 11, False)[1:]

注:用numpy来生成等分,并且没有多位小数位数,要让间隔+1.比如:0-1之间生成5个数,每个数都是等间隔的小数,并且只有一位小数位数,间隔就要设置为6.

2.创建一个大小为10的数组,数组里面的数是随机数,并排序(10)

a = np.random.randint(0, 9, 10)
a.sort()

3.对一个小数组用比np.sum快的方法求和(10)

a = np.arange(0,20)
np.add.reduce(a)

4.比较两个随机数组是否相等(10)

#默认在1e-05的误差范围内,比较两个array是不是每一元素都相等
np.allclose(A,B) 
# 比较两个数组是否相等
np.array_equal(A,B) 

5.创建一个不可变数组(只读)(10)

a5 = np.zeros(10)
a5.flags.writeable = False

6.创建一个大小为10的数组并把最大值设为0(10)

a6 = np.random.uniform(0,9,20)
a6[a6.argmax()] =0

7.x是一维数组,把x按照y的长度在第二个维度上扩展;同样的把y也这样操作(10)

x = y = 5
nx = np.linspace(0, 1, x)
ny = np.linspace(0, 1, y)
xx, yy = np.meshgrid(nx, ny)

8.给定array X 和 Y, 构造柯西矩阵C(10)

X = np.arange(3)
Y = X + 0.5
C = 1.0 / np.subtract.outer(X, Y)

9.构建一个代表位置 (x,y) 和 颜色 (r,g,b)的矩阵。(10)

mydtype = np.dtype([('xy',[('x', np.int64), ('y', np.int64)]), ('color',[('r', np.int16), ('g', np.int16), ('b', np.int16)])])

np.ones((3, 2), mydtype)

10.用一个100*2的随机向量来表示坐标,计算点到点的距离(10)

Z = np.random.random((100,2))
X,Y = np.atleast_2d(Z[:,0], Z[:,1])
D = np.sqrt( (X-X.T)**2 + (Y-Y.T)**2)
# 这个速度比前面的快
import scipy.spatial

Z = np.random.random((100,2))
D = scipy.spatial.distance.cdist(Z,Z)

注:在对求阶乘,计算坐标这种东西,都是把所有数据先组成一个矩阵,也就是说都是通过一个数据减去所有数据。

你可能感兴趣的:(numpy)