当前位置: 代码迷 >> 综合 >> 4.1 Numpy ndarray:多维数组对象(2)
  详细解决方案

4.1 Numpy ndarray:多维数组对象(2)

热度:9   发布时间:2024-01-29 20:07:59.0

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]])

神奇索引与切片不同,它总是将数据复制到一个新的数组中