Python numpy數組元素的訪問及數組的增刪改查功能詳解
numpy ndarray數組元素的訪問及數組的增刪改查
ndarray數組元素的訪問
- ?? ndarray 切片操作的基本語法和列表類似,為 arr[start:stop:step],其中 star、stop 和 step 是可選參數。
- ?? 對于多維數組,每個維度都可以單獨指定切片范圍,語法為 arr[dim1_start:dim1_stop:dim1_step, dim2_start:dim2_stop:dim2_step, …]。
- ?? start:切片起始索引,包含該索引對應的元素,默認值為 0。負數索引表示從數組末尾開始計數。
- ?? stop:切片結束索引,不包含該索引對應的元素,默認值為數組的長度。負數索引表示從數組末尾開始計數。
- ?? step:切片步長,默認值為 1。正數表示從左到右選取元素,負數表示從右到左選取元素。
- ?? 得到的結果仍是ndarray。
一維ndarray的元素訪問
?? 0個冒號的,stop
code:
import numpy as np
nd1 = np.array(range(8))
print("nd1[3]: %d, nd1[-2]: %d" % (nd1[3], nd1[-2]))
result:
nd1[3]: 3, nd1[-2]: 6?? 1個冒號的,start and stop
code:
import numpy as np
nd1 = np.array(range(8))
print("nd1[:3]: %s, nd1[2:4]: %s, nd1[4:]: %s, nd1[:]: %s" % (nd1[:3], nd1[2:4], nd1[4:], nd1[:]))
result:
nd1[:3]: [0 1 2], nd1[2:4]: [2 3], nd1[4:]: [4 5 6 7], nd1[:]: [0 1 2 3 4 5 6 7]?? 2個冒號的,start,stop,step
code:
import numpy as np
nd1 = np.array(range(8))
import numpy as np
nd1 = np.array(range(8))
print("nd1[::3]: %s, nd1[2::4]: %s, nd1[:4:]: %s, nd1[:6:2]: %s,"% (nd1[::3], nd1[2::4], nd1[:4:], nd1[:6:2]))
print("nd1[2:5:]: %s, nd1[1::]: %s, nd1[1:7:3]: %s, nd1[::]: %s" % (nd1[2:5:], nd1[1::], nd1[1:7:3], nd1[::]))
result:
nd1[::3]: [0 3 6], nd1[2::4]: [2 6], nd1[:4:]: [0 1 2 3], nd1[:6:2]: [0 2 4],
nd1[2:5:]: [2 3 4], nd1[1::]: [1 2 3 4 5 6 7], nd1[1:7:3]: [1 4], nd1[::]: [0 1 2 3 4 5 6 7]二維ndarray的元素訪問
??訪問單個元素,[行,列]指明要訪問的元素的行列
code:
import numpy as np
nd1 = np.array([[1, 2, 3], [4, 5, 6]])
print("nd1[1,2]: %s" % nd1[1, 2])
result:
nd1[1,2]: 6- ??[]訪問一行或者多行
- ??[]中一個數指行,有逗號,逗號前指行,后指列
- ??行和列分別可以用切片,列表標識多行或者多列
code:
import numpy as np
nd1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("nd1[1]: %s", nd1[1]) # 一個參數指行
print("nd1[1, :]", nd1[1, :]) # 用中間逗號的方式指定行和列
print("nd1[0:2, :]", nd1[0:2, :]) # 用切片的方式指定多行
print("nd1[[0,1], :]", nd1[0:2, :]) # 用列表的方式指定多行
result:
nd1[1]: [4 5 6]
nd1[1, :]: [4 5 6]
nd1[0:2, :]: [[1 2 3]
[4 5 6]]
nd1[[0,1], :]: [[1 2 3]
[4 5 6]]- ??訪問一列或者多列
- ??訪問某一列[:, 列號]
- ??訪問某一列[:, 切片或者列表]訪問多列
code:
import numpy as np
nd1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("nd1[:, :]:", nd1[:, :]) # 所有行, 所有列
print("nd1[:, 1]:", nd1[:, 1]) # 第1列
print("nd1[1, 0:2]:", nd1[1, 0:2]) # 第一行的0列和1列
print("nd1[[0,1], [0, 2]]:", nd1[[0, 1], [0, 2]]) # 第一行的0列和1列
result:
nd1[:, :]: [[1 2 3]
[4 5 6]
[7 8 9]]
nd1[:, 1]: [2 5 8]
nd1[1, 0:2]: [4 5]
nd1[[0,1], [0, 2]]: [1 6]ndarray數組元素的增刪改查
ndarray數組元素的增加 np.append
-??np.append(arr, values, axis=None),values為要添加的數組,注意要和arr的shape匹配才能添加。
??生成新的數據,原數據不變,values為要添加的數組,注意要和arr的shape匹配才能添加。
code: import numpy as np nd1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) nd2 = [[11, 22, 33]] # 上下方向添加, 要是一行數據的形式 nd3 = [[44, 444], [55, 555], [66, 666]] new_nd1 = np.append(nd1, nd2, axis=0) # 上下方向添加 print(new_nd1) new_nd2 = np.append(nd1, nd3, axis=1) # 左右方向添加 print(new_nd2) result: [[ 1 2 3] [ 4 5 6] [ 7 8 9] [11 22 33]] [[ 1 2 3 44 444] [ 4 5 6 55 555] [ 7 8 9 66 666]]
np.insert
-?? np.insert() 函數可以在數組的指定位置插入值,返回一個新的數組。
-?? np.insert(arr, obj, values, axis=None)
code:
import numpy as np
nd1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# insert(arr, obj, values, axis=None)
nd2 = np.insert(nd1, 1, [11, 22, 33], axis=0)
nd3 = np.insert(nd2, 3, [[44, 55, 66]], axis=0)
nd4 = np.insert(nd1, 1, [11, 22, 33], axis=1)
nd5 = np.insert(nd4, 3, [[44, 55, 66]], axis=1)
print("nd3:\n", nd3)
print("nd5:\n", nd5)
result:
nd3:
[[ 1 2 3]
[11 22 33]
[ 4 5 6]
[44 55 66]
[ 7 8 9]]
nd5:
[[ 1 11 2 44 3]
[ 4 22 5 55 6]
[ 7 33 8 66 9]]np.concatenate
- ?? np.concatenate() 函數可以將多個數組沿著指定的軸連接在一起,實現數據的合并。
- ??返回一個新的數組,原數組不會被修改。
code:
import numpy as np
# 一維數組拼接
arr_1d_1 = np.array([1, 2, 3])
arr_1d_2 = np.array([4, 5, 6])
new_arr_1d = np.concatenate((arr_1d_1, arr_1d_2)) # 一維數字組拼接不用指定axis
print("一維數組拼接后的結果:", new_arr_1d)
# 二維數組拼接
arr_2d_1 = np.array([[1, 2], [3, 4]])
arr_2d_2 = np.array([[5, 6], [7, 8]])
# 垂直拼接
new_arr_2d_vertical = np.concatenate((arr_2d_1, arr_2d_2), axis=0) # 垂直方向上拼接
print("\n二維數組垂直拼接后的結果:")
print(new_arr_2d_vertical)
# 水平拼接
new_arr_2d_horizontal = np.concatenate((arr_2d_1, arr_2d_2), axis=1) # 水平方向上拼接
print("\n二維數組水平拼接后的結果:")
print(new_arr_2d_horizontal)
result:
一維數組拼接后的結果: [1 2 3 4 5 6]
二維數組垂直拼接后的結果:
[[1 2]
[3 4]
[5 6]
[7 8]]
二維數組水平拼接后的結果:
[[1 2 5 6]
[3 4 7 8]]np.hstack和np.vstack
- ?? np.hstack(tup1,tup2,…),注意參數的類型。
- ?? 參數tup是一個元組、列表或其他可迭代對象,其中包含了要進行水平拼接的多個數組。
- ?? np.vstack(tup1,tup2),和np.hstack不同的是拼接的方向不同。
code:
import numpy as np
nd1 = np.array([[1, 2], [3, 4], [5, 6]])
nd2 = np.array([[11, 22], [33, 44], [55, 66]])
print("hstack: ", np.hstack((nd1, nd2)))
print("vstack: ", np.vstack((nd1, nd2)))
result:
hstack: [[ 1 2 11 22]
[ 3 4 33 44]
[ 5 6 55 66]]
vstack: [[ 1 2]
[ 3 4]
[ 5 6]
[11 22]
[33 44]
[55 66]]ndarray數組元素的刪除
np.delete()刪除指定位置的元素
-?? NumPy 數組是固定大小的,直接刪除元素通常會創(chuàng)建一個新數組。
-?? 刪除一維數組元素,np.delete(arr1, idx),指定位置為idx。
-?? 刪除二維數組元素,np.delete(arr1, idx, axis=0/1),指定位置為idx,按行或者列要指定axis。
code: import numpy as np arr1 = np.array(range(5)) arr2 = np.delete(arr1, [0,4]) arr3 = np.delete(arr1, 2) print(arr1) print(arr2) print(arr3) result: import numpy as np arr1 = np.array(range(5)) arr2 = np.delete(arr1, [0,4]) arr3 = np.delete(arr1, 2) print(arr1) print(arr2) print(arr3)
code:
arr1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr2 = np.delete(arr1, 1, axis=0) # 刪除第2行(索引1)
arr3 = np.delete(arr1, [1,2], axis=0) # 刪除第2行(索引1)
print("arr1:\n",arr1)
print("arr2:\n",arr2)
print("arr3:\n",arr3)
result:
arr1:
[[1 2 3]
[4 5 6]
[7 8 9]]
arr2:
[[1 2 3]
[7 8 9]]
arr3:
[[1 2 3]]根據條件刪除元素(過濾)
- ?? 使用布爾索引創(chuàng)建符合條件的新數組
- ?? 類似于(arr1>1) & (arr1<5)的表達式生成一個布爾數組。
code:
import numpy as np
arr1 = np.array([1, 2, 3, 4, 5, 6])
condition = (arr1>1) & (arr1<5)
arr2 = arr1[condition]
print("arr1\n", arr1)
print(condition)
print("arr2\n", arr2)
result:
arr1
[1 2 3 4 5 6]
[False True True True False False]
arr2
[2 3 4]np.unique刪除重復元素
?? 刪除重復元素,并重新排序
code: import numpy as np arr = np.array([1, 2, 2, 3, 3, 3, 5, 5, 4, 4]) unique_arr = np.unique(arr) print(type(unique_arr), unique_arr) result: <class 'numpy.ndarray'> [1 2 3 4 5]
修改ndarray中的元素
直接索引賦值
?? 支持一維和多維
code:
import numpy as np
arr1 = np.array([10, 20, 30, 40])
arr1[2] = 300
arr1[-1] = 400
print("arr1:\n", arr1)
arr2 = np.array([[1, 2], [3, 4]])
arr2[0, 1] = 20
print("arr2:\n", arr2)
result:
arr1:
[ 10 20 300 400]
arr2:
[[ 1 20]
[ 3 4]]切片賦值
- ?? 通過切片選擇多個元素,批量修改值。
- ?? 賦值時需要確保右側值的形狀與切片形狀兼容。
code:
import numpy as np
arr1 = np.array([1, 2, 3, 4, 5])
arr1[1:4] = [20, 30, 40]
print("arr1:\n", arr1)
arr2 = np.array([1, 2, 3, 4, 5])
arr2[1:4] = 0 # 賦值為同一個數
print("arr2:\n", arr2)
arr3 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr3[:, 2] = [20, 50, 80] # 修改第2列
print("arr3:\n", arr3)
result:
arr1:
[ 1 20 30 40 5]
arr2:
[1 0 0 0 5]
arr3:
[[ 1 2 20]
[ 4 5 50]
[ 7 8 80]]布爾索引賦值
?? 通過布爾掩碼選擇符合條件的元素,批量修改。
code:
import numpy as np
arr1 = np.array([1, 2, 6, 4, 10, 5, 8])
arr1[(arr1 > 3) & (arr1 < 8) ] = 0
print("arr1:\n", arr1)
result:
arr1:
[ 1 2 0 0 10 0 8]使用 np.put() 按索引批量賦值
-?? np.put(arr, [索引],[對應索引的修改值])
code: import numpy as np arr = np.array([10, 20, 30, 40, 50]) np.put(arr, [0, 2, 4], [100, 300, 500]) # 修改索引0、2、4的元素 print(arr) result: [100 20 300 40 500]
使用 np.where() 條件替換
-?? np.where(condition),返回滿足條件的元素的索引。
code:
import numpy as np
arr1 = np.array([1, 2, 3, 4, 5, 6])
indices = np.where(arr1 > 3)
print("indices:\n", indices)
print("arr1[indices]:\n", arr1[indices])
# np.where對于二維數組, 返回的是行索引和列索引列表, 滿足條件的是2, 3,4這兩個元素, 即為
# arr2[0,1], arr2[1,0], arr2[1,1],它們行索引形成[0,1,1], 列索引形成[1,0,1]
arr2 = np.array([[1, 2], [3, 4]])
row_idx, col_idx = np.where(arr2 > 1)
print(f"row_idx:{row_idx}, col_idx: {col_idx}")
result:
indices:
(array([3, 4, 5], dtype=int64),)
arr1[indices]:
[4 5 6]
row_idx:[0 1 1], col_idx: [1 0 1]- -?? np.where(condition, x, y),當 condition 為 True 時,取 x 的值,否則取y的值。
- -?? 算是3目運算符。
code:
import numpy as np
dt = np.dtype([
('name', 'U3'), # Unicode字符串,最大長度3
('age', np.int32),
('height', float)
])
arr = np.array([
('Alice', 25, 1.65),
('Bob', 30, 1.80),
('Charlie', 22, 1.75)
], dtype=dt)
print(arr)
print(arr[0]["name"])
print(arr["age"])
result:
[('Ali', 25, 1.65) ('Bob', 30, 1.8 ) ('Cha', 22, 1.75)]
Ali
[25 30 22]修改為特殊值
- ??? 如果要賦值為nan,必須dtarray為float型,先要進行數據類型的轉換。
numpy中的裁剪函數Clip
- ??Clip函數用于將數組中的元素限制在指定的最小值和最大值之間。
- ?? np.clip(arr, a_min, a_max, out=None), arr:輸入的數組。a_min:最小值(低于此值的元素將被替換為 a_min, a_max:最大值(高于此值的元素將被替換為 a_max)。
- out(可選):指定輸出結果的數組,如果指定為arr,相當于原地修改,若不提供則返回新數組。
code: import numpy as np arr2d = np.array([[1, 5], [10, 15]]) clipped = np.clip(arr2d, 3, 12, out=arr2d) print(clipped) print(arr2d) result: [[ 3 5] [10 12]] [[ 3 5] [10 12]]
到此這篇關于Python numpy數組元素的訪問及數組的增刪改查的文章就介紹到這了,更多相關Python numpy數組元素增刪改查內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解在Anaconda環(huán)境下Python安裝pydot與graphviz的方法
這篇文章主要為大家詳細介紹了在Anaconda環(huán)境中,安裝Python語言pydot與graphviz兩個模塊的方法,文中的安裝方法講解詳細,感興趣?的可以了解一下2023-02-02
詳解Python如何在Web環(huán)境中使用Matplotlib進行數據可視化
數據可視化是數據科學和分析中一個至關重要的部分,它能幫助我們更好地理解和解釋數據,在現代應用中,越來越多的開發(fā)者希望能夠將數據可視化結果展示在網頁上,本文將介紹如何在 Web 環(huán)境中使用 Matplotlib 進行可視化,包括基本概念、集成方式以及實用示例2024-11-11

