1、Numpy数组算术
任何两个等尺寸数组之间的算术操作都应用了逐元素操作的方式
arr = np.array([[1.,2.,3.],[4.,5.,6.]])
arr + arr
2、索引与切片
arr = np.arange(10)
arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[5:8]
array([5, 6, 7])
arr[5:8] = 12
arr
array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
数组arr的第6位至第8位,即索引5-7被替换成12
神奇的事情发生了!!请看↓↓↓
arr_slice = arr[5:8]
arr_slice
array([12, 12, 12])
arr_slice[:] = 123123 #改变这个取出来的,原来的数组也会改变。神奇!!
arr
array([ 0, 1, 2, 3, 4, 123123, 123123, 123123,8, 9])
当改变arr_slice时,变化也会体现在原数组上
原因:【由于NumPy被设计成适合处理非常大的数组,你可以想象如果NumPy持续复制数据会引起多少内存问题】
如果还想要一份切片的拷贝而不是一份视图的化,采用copy(),请看↓
arr3 = arr[0:2].copy() #复制出来就不会了!
arr3
array([0, 1])
arr3[0:2] = 333
arr3
array([333, 333])
arr
array([ 0, 1, 2, 3, 4, 123123, 123123, 123123,8, 9])
切片索引
布尔索引
names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
data = np.random.randn(7,4)
data
array([[-1.1333329 , 1.6800552 , -0.38183741, 1.34035734],[-2.13055535, 0.31186826, 0.53695706, -0.34477031],[-2.00200332, 0.37890395, 0.39114877, 0.47909522],[ 0.39593762, 1.23645138, -0.9999515 , 1.86384212],[ 0.04416461, 0.35912253, -0.87371184, -0.77789266],[ 0.49067264, 1.2346965 , 0.97662499, 0.19701311],[-0.77657512, 1.05924711, -0.39845053, -0.19590311]])
names == 'Bob' #向量化比较
array([ True, False, False, True, False, False, False])
data[names == 'Bob'] #第一个和第四个是True,所以选第一行和第四行
array([[-1.1333329 , 1.6800552 , -0.38183741, 1.34035734],[ 0.39593762, 1.23645138, -0.9999515 , 1.86384212]])
data[names == 'Bob',2:] #第三列到最后一列
array([[-0.38183741, 1.34035734],[-0.9999515 , 1.86384212]])
data[~(names == 'Bob')] #利用~进行反选
array([[-2.13055535, 0.31186826, 0.53695706, -0.34477031],[-2.00200332, 0.37890395, 0.39114877, 0.47909522],[ 0.04416461, 0.35912253, -0.87371184, -0.77789266],[ 0.49067264, 1.2346965 , 0.97662499, 0.19701311],[-0.77657512, 1.05924711, -0.39845053, -0.19590311]])
- 神奇索引
arr = np.empty((8,4))
for i in range(8):arr[i] = i
arr
array([[0., 0., 0., 0.],[1., 1., 1., 1.],[2., 2., 2., 2.],[3., 3., 3., 3.],[4., 4., 4., 4.],[5., 5., 5., 5.],[6., 6., 6., 6.],[7., 7., 7., 7.]])
arr[[-3,-4]] #取出倒数第三行和第四行
array([[5., 5., 5., 5.],[4., 4., 4., 4.]])
reshape方法将数组排列成8行4列
arr = np.arange(32).reshape((8,4))
arr
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, 30, 31]])
arr[[1,5,7,2],[0,3,1,2]]
取出元素(1,0)、(5,3 )、(7,1)、(2,2)
array([ 4, 23, 29, 10])
arr[[1,5,7,2]][:,[0,3,1,2]]
取出元素(1,0)、(1,3)、(1,1)、(1,2)
(5,0)、(5,3)、(5,1)、(5,2)
......
array([[ 4, 7, 5, 6],[20, 23, 21, 22],[28, 31, 29, 30],[ 8, 11, 9, 10]])
神奇索引与切片不同,它总是将数据复制到一个新的数组中