1. 程式人生 > >NumPy學習(索引和切片,合並,分割,copy與deep copy)

NumPy學習(索引和切片,合並,分割,copy與deep copy)

light 共享數據 訪問 展開 -a class 是把 第一個 text

NumPy學習(索引和切片,合並,分割,copy與deep copy)

目錄

索引和切片

合並

分割

copy與deep copy

  

索引和切片

通過索引和切片可以訪問以及修改數組元素的值

一維數組

程序示例

import numpy as np

#索引與切片
array=np.arange(3,15)
print(array)
print(array[3])#數組下標為3的元素
print(‘\n‘)
print(array[1:3])#取從下標1到下標3,不包括下標3
print(array[1:-9])
print(array[-11:3])
print(‘\n‘)
print(array[:]) #全部元素
print(array[1:])#從下標為1的元素到最後一個元素
print(array[:7])#第一個元素到下標為7的元素,不包括下標為7的元素
print(array[::2])#間隔2

  

運行結果

[ 3  4  5  6  7  8  9 10 11 12 13 14]
6


[4 5]
[4 5]
[4 5]


[ 3  4  5  6  7  8  9 10 11 12 13 14]
[ 4  5  6  7  8  9 10 11 12 13 14]
[3 4 5 6 7 8 9]
[ 3  5  7  9 11 13]

 

花式索引

程序示例

import numpy as np
#指定索引位置 index=[1,5,-7] array3=array[index] print(array3) #使用布爾數組來花式索引 mask=np.array([0,1,0,1,1,0,1,0,1,0,0,1],dtype=bool) array4=array[mask] print(array4)

  

運行結果

[4 8 8]
[ 4  6  7  9 11 14]

  

多維 數組

程序示例

import numpy as np
array2=np.arange(3,15).reshape(3,4) print(array2) print(array2[2])#獲取數組的某行 print(‘\n‘) print(array2[2][2])#獲取數組的某個元素,指定行和列 print(array2[2,2]) print(‘\n‘) print(array2[2,:])#獲取數組的第三行 print(array2[:,2])#獲取數組的第三列 print(array2[1:3,1])#獲取數組第2和3行的第二列元素 print(array2[1,1:3])#獲取數組的第2行的2和3列 print(‘--------------------------------------------------‘)
#輸出全部行,一行輸出成一個列表 for row in array2: print(row) print(‘\n‘)
#輸出全部列,一列輸出成一個列表,array2.T為轉置 for column in array2.T: print(column) print(‘\n‘)
#將數組展開為一個列表 print(array2.flatten()) print(‘\n‘)
#將數組展開為一個列表,其中array2.flat將數組變為叠代器,上面的flatten()方法則直接返回 for item in array2.flat: print(item)

  

運行結果

[[ 3  4  5  6]
 [ 7  8  9 10]
 [11 12 13 14]]
[11 12 13 14]


13
13


[11 12 13 14]
[ 5  9 13]
[ 8 12]
[8 9]
--------------------------------------------------
[3 4 5 6]
[ 7  8  9 10]
[11 12 13 14]


[ 3  7 11]
[ 4  8 12]
[ 5  9 13]
[ 6 10 14]


[ 3  4  5  6  7  8  9 10 11 12 13 14]


3
4
5
6
7
8
9
10
11
12
13
14

  

花式索引
程序示例
import numpy as np

# 多維數組花式索引,我們需要給定行和列的值
arr1=np.array([[4,5,7,9],[2,4,6,8],[7,3,1,7]])
print(arr1)
print(‘\n‘)
#返回一條次對角線上的3個值
print(arr1[(0,1,2),(1,2,3)])
print(‘\n‘)
#返回的最後2行的第1,2,3列
print(arr1[1:,[0,1,2]])
#使用mask進行索引
print(‘\n‘)
mask=np.array([1,0,1,1],dtype=bool)
arr2=arr1[2,mask]
print(arr2)

 

運行結果

[[4 5 7 9]
 [2 4 6 8]
 [7 3 1 7]]


[5 6 7]


[[2 4 6]
 [7 3 1]]


[7 1 7]

  

合並

一維數組

程序示例

import numpy as np
array1=np.array([1,2,3])
array2=np.array([4,5,6])
array3=np.vstack((array1,array2)) #縱向合並
array4=np.hstack((array1,array2)) #橫向合並
print(array3)
print(array1.shape)
print(array2.shape)
print(array3.shape)

運行結果

[[1 2 3]
 [4 5 6]]
(3,)
(3,)
(2, 3)

  

import numpy as np


# #將列表轉為numpy的數組
array1=np.array([1,2,3]).reshape(3,1)
array2=np.array([4,5,6]).reshape(3,1)
array3=np.vstack((array1,array2)) #縱向合並
array4=np.hstack((array1,array2)) #橫向合並

array5=np.concatenate((array1,array2))
print(array5)
print(‘\n‘)
#對多個數組進行合並,axis=0為縱向合並,反之為橫向合並
array6=np.concatenate((array1,array2),axis=1)
print(array6)

  

[[1]
 [2]
 [3]
 [4]
 [5]
 [6]]


[[1 4]
 [2 5]
 [3 6]]

  

分割

程序示例

import numpy as np



arr1=np.arange(12).reshape(3,4)
print(arr1)

print(‘橫向分割,對列進行分割,分割成2塊‘)
print(np.split(arr1,2,axis=1))
print(np.hsplit(arr1,2))

print(‘縱向分割,對行進行分割,分割成3塊‘)
print(np.split(arr1,3,axis=0))
print(np.vsplit(arr1,3))

print(‘不等量分割,(1為列,0為行)‘)

print(np.array_split(arr1,3,axis=1))

  

運行結果

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
橫向分割,對列進行分割,分割成2塊
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11]])]
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11]])]
縱向分割,對行進行分割,分割成3塊
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
不等量分割,(1為列,0為行)
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2],
       [ 6],
       [10]]), array([[ 3],
       [ 7],
       [11]])]

copy與deep copy

與原數組共享數據的形式

import numpy as np


arr=np.arange(4)
b=arr
c=arr
d=b

print(arr)
print(b)
print(c)
print(d)

print(‘修改arr[0]的值‘)
arr[0]=10

print(b is arr,b)
print(c is arr,c)
print(d is arr,d)

  

運行結果

[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
修改arr[0]的值
True [10  1  2  3]
True [10  1  2  3]
True [10  1  2  3]

  

不與原數據共享數據的形式

import numpy as np


arr=np.arange(4)
b=arr.copy()
print(arr)
print(b)


print(‘修改arr[0]的值‘)
arr[0]=10
print(arr)
print(b is arr,b)

  

運行結果

[0 1 2 3]
[0 1 2 3]
修改arr[0]的值
False [0 1 2 3]

  

總結:

如果你想把它們關聯起來,就使用第一種方法

如果只是把一個數組的值給另一個數組,使用第二種方法

NumPy學習(索引和切片,合並,分割,copy與deep copy)